美文网首页
2022-07-16 tidyverse 常见函数select、

2022-07-16 tidyverse 常见函数select、

作者: 学习生信的小兔子 | 来源:发表于2022-07-16 12:11 被阅读0次

    select

    #演示数据
    library(readxl)
    df=read_xlsx("datas/ExamDatas_NAs.xlsx")
    df
    # A tibble: 50 x 8
       class name   sex   chinese  math english moral science
       <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
     1 六1班 何娜   女         87    92      79     9      10
     2 六1班 黄才菊 女         95    77      75    NA       9
     3 六1班 陈芳妹 女         79    87      66     9      10
     4 六1班 陈学勤 男         NA    79      66     9      10
     5 六1班 陈祝贞 女         76    79      67     8      10
     6 六1班 何小薇 女         83    73      65     8       9
     7 六1班 雷旺   男         NA    80      68     8       9
     8 六1班 陈欣越 男         57    80      60     9       9
     9 六1班 黄亦婷 女         77    NA      54     8      10
    10 六1班 陈媚   女         68    55      66     8       9
    # ... with 40 more rows
    

    用列名或索引选择列

    df %>% 
      select(name,sex,math)   #或者select(2,3,5)
    # A tibble: 50 x 3
       name   sex    math
       <chr>  <chr> <dbl>
     1 何娜   女       92
     2 黄才菊 女       77
     3 陈芳妹 女       87
     4 陈学勤 男       79
     5 陈祝贞 女       79
     6 何小薇 女       73
     7 雷旺   男       80
     8 陈欣越 男       80
     9 黄亦婷 女       NA
    10 陈媚   女       55
    # ... with 40 more rows
    还可用
    :选择连续的若干列
    !反选
    &和|  交和并
    
    
    df %>% 
    +   select(starts_with("c"))
    # A tibble: 50 x 2
       class chinese
       <chr>   <dbl>
     1 六1班      87
     2 六1班      95
     3 六1班      79
     4 六1班      NA
     5 六1班      76
     6 六1班      83
     7 六1班      NA
     8 六1班      57
     9 六1班      77
    10 六1班      68
    # ... with 40 more rows
    df %>% 
    +   select(matches("m.*a"))
    # A tibble: 50 x 2
        math moral
       <dbl> <dbl>
     1    92     9
     2    77    NA
     3    87     9
     4    79     9
     5    79     8
     6    73     8
     7    80     8
     8    80     9
     9    NA     8
    10    55     8
    # ... with 40 more rows
    df %>% 
    + select(contains("a"))
    # A tibble: 50 x 4
       class name    math moral
       <chr> <chr>  <dbl> <dbl>
     1 六1班 何娜      92     9
     2 六1班 黄才菊    77    NA
     3 六1班 陈芳妹    87     9
     4 六1班 陈学勤    79     9
     5 六1班 陈祝贞    79     8
     6 六1班 何小薇    73     8
     7 六1班 雷旺      80     8
     8 六1班 陈欣越    80     9
     9 六1班 黄亦婷    NA     8
    10 六1班 陈媚      55     8
    # ... with 40 more rows
    #选择所有数值型的列
    df %>% 
      select(
        where(is.numeric)
      )
    # A tibble: 50 x 5
       chinese  math english moral science
         <dbl> <dbl>   <dbl> <dbl>   <dbl>
     1      87    92      79     9      10
     2      95    77      75    NA       9
     3      79    87      66     9      10
     4      NA    79      66     9      10
     5      76    79      67     8      10
     6      83    73      65     8       9
     7      NA    80      68     8       9
     8      57    80      60     9       9
     9      77    NA      54     8      10
    10      68    55      66     8       9
    # ... with 40 more rows
    df %>% 
      select(-c(class,name,sex))
    # A tibble: 50 x 5
       chinese  math english moral science
         <dbl> <dbl>   <dbl> <dbl>   <dbl>
     1      87    92      79     9      10
     2      95    77      75    NA       9
     3      79    87      66     9      10
     4      NA    79      66     9      10
     5      76    79      67     8      10
     6      83    73      65     8       9
     7      NA    80      68     8       9
     8      57    80      60     9       9
     9      77    NA      54     8      10
    10      68    55      66     8       9
    # ... with 40 more rows
    #可调整顺序
    df %>% 
      select(starts_with("m"),everything())
    # A tibble: 50 x 8
        math moral class name   sex   chinese english science
       <dbl> <dbl> <chr> <chr>  <chr>   <dbl>   <dbl>   <dbl>
     1    92     9 六1班 何娜   女         87      79      10
     2    77    NA 六1班 黄才菊 女         95      75       9
     3    87     9 六1班 陈芳妹 女         79      66      10
     4    79     9 六1班 陈学勤 男         NA      66      10
     5    79     8 六1班 陈祝贞 女         76      67      10
     6    73     8 六1班 何小薇 女         83      65       9
     7    80     8 六1班 雷旺   男         NA      68       9
     8    80     9 六1班 陈欣越 男         57      60       9
     9    NA     8 六1班 黄亦婷 女         77      54      10
    10    55     8 六1班 陈媚   女         68      66       9
    # ... with 40 more rows
    df %>% 
    +   select(where(is.numeric),everything())
    # A tibble: 50 x 8
       chinese  math english moral science class name   sex  
         <dbl> <dbl>   <dbl> <dbl>   <dbl> <chr> <chr>  <chr>
     1      87    92      79     9      10 六1班 何娜   女   
     2      95    77      75    NA       9 六1班 黄才菊 女   
     3      79    87      66     9      10 六1班 陈芳妹 女   
     4      NA    79      66     9      10 六1班 陈学勤 男   
     5      76    79      67     8      10 六1班 陈祝贞 女   
     6      83    73      65     8       9 六1班 何小薇 女   
     7      NA    80      68     8       9 六1班 雷旺   男   
     8      57    80      60     9       9 六1班 陈欣越 男   
     9      77    NA      54     8      10 六1班 黄亦婷 女   
    10      68    55      66     8       9 六1班 陈媚   女   
    # ... with 40 more rows
    df %>% 
    +   rename(数学=math,科学=science)
    # A tibble: 50 x 8
       class name   sex   chinese  数学 english moral  科学
       <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl> <dbl>
     1 六1班 何娜   女         87    92      79     9    10
     2 六1班 黄才菊 女         95    77      75    NA     9
     3 六1班 陈芳妹 女         79    87      66     9    10
     4 六1班 陈学勤 男         NA    79      66     9    10
     5 六1班 陈祝贞 女         76    79      67     8    10
     6 六1班 何小薇 女         83    73      65     8     9
     7 六1班 雷旺   男         NA    80      68     8     9
     8 六1班 陈欣越 男         57    80      60     9     9
     9 六1班 黄亦婷 女         77    NA      54     8    10
    10 六1班 陈媚   女         68    55      66     8     9
    # ... with 40 more rows
    

    mutate函数

    创建新列

    df %>% 
    +   mutate(new_col=1:n())
    # A tibble: 50 x 9
       class name   sex   chinese  math english moral science new_col
       <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>   <int>
     1 六1班 何娜   女         87    92      79     9      10       1
     2 六1班 黄才菊 女         95    77      75    NA       9       2
     3 六1班 陈芳妹 女         79    87      66     9      10       3
     4 六1班 陈学勤 男         NA    79      66     9      10       4
     5 六1班 陈祝贞 女         76    79      67     8      10       5
     6 六1班 何小薇 女         83    73      65     8       9       6
     7 六1班 雷旺   男         NA    80      68     8       9       7
     8 六1班 陈欣越 男         57    80      60     9       9       8
     9 六1班 黄亦婷 女         77    NA      54     8      10       9
    10 六1班 陈媚   女         68    55      66     8       9      10
    # ... with 40 more rows
    #n()返回当前分组的样本数,未分组则为总行数
    

    计算新列

    df %>% 
      mutate(total=chinese+math+english+moral+science)
    # A tibble: 50 x 9
       class name   sex   chinese  math english moral science total
       <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl> <dbl>
     1 六1班 何娜   女         87    92      79     9      10   277
     2 六1班 黄才菊 女         95    77      75    NA       9    NA
     3 六1班 陈芳妹 女         79    87      66     9      10   251
     4 六1班 陈学勤 男         NA    79      66     9      10    NA
     5 六1班 陈祝贞 女         76    79      67     8      10   240
     6 六1班 何小薇 女         83    73      65     8       9   238
     7 六1班 雷旺   男         NA    80      68     8       9    NA
     8 六1班 陈欣越 男         57    80      60     9       9   215
     9 六1班 黄亦婷 女         77    NA      54     8      10    NA
    10 六1班 陈媚   女         68    55      66     8       9   206
    # ... with 40 more rows
    df1=df %>% 
      mutate(med=median(math,na.rm = TRUE),
             label=math>med,
             label=as.numeric(label))
    # A tibble: 50 x 10
       class name   sex   chinese  math english moral science   med label
       <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl> <dbl> <dbl>
     1 六1班 何娜   女         87    92      79     9      10    73     1
     2 六1班 黄才菊 女         95    77      75    NA       9    73     1
     3 六1班 陈芳妹 女         79    87      66     9      10    73     1
     4 六1班 陈学勤 男         NA    79      66     9      10    73     1
     5 六1班 陈祝贞 女         76    79      67     8      10    73     1
     6 六1班 何小薇 女         83    73      65     8       9    73     0
     7 六1班 雷旺   男         NA    80      68     8       9    73     1
     8 六1班 陈欣越 男         57    80      60     9       9    73     1
     9 六1班 黄亦婷 女         77    NA      54     8      10    73    NA
    10 六1班 陈媚   女         68    55      66     8       9    73     0
    # ... with 40 more rows
    

    替换NA

    #replace_na
    starwars
    # A tibble: 87 x 14
       name     height  mass hair_color  skin_color eye_color birth_year sex   gender
       <chr>     <int> <dbl> <chr>       <chr>      <chr>          <dbl> <chr> <chr> 
     1 Luke Sk~    172    77 blond       fair       blue            19   male  mascu~
     2 C-3PO       167    75 NA          gold       yellow         112   none  mascu~
     3 R2-D2        96    32 NA          white, bl~ red             33   none  mascu~
     4 Darth V~    202   136 none        white      yellow          41.9 male  mascu~
     5 Leia Or~    150    49 brown       light      brown           19   fema~ femin~
     6 Owen La~    178   120 brown, grey light      blue            52   male  mascu~
     7 Beru Wh~    165    75 brown       light      blue            47   fema~ femin~
     8 R5-D4        97    32 NA          white, red red             NA   none  mascu~
     9 Biggs D~    183    84 black       light      brown           24   male  mascu~
    10 Obi-Wan~    182    77 auburn, wh~ fair       blue-gray       57   male  mascu~
    # ... with 77 more rows, and 5 more variables: homeworld <chr>, species <chr>,
    #   films <list>, vehicles <list>, starships <list>
    starwars %>% 
      replace_na(list(
        hair_color="UNKNOWN",
        height=median(.$height,na.rm=TRUE)
      ))
    # A tibble: 87 x 14
       name     height  mass hair_color  skin_color eye_color birth_year sex   gender
       <chr>     <int> <dbl> <chr>       <chr>      <chr>          <dbl> <chr> <chr> 
     1 Luke Sk~    172    77 blond       fair       blue            19   male  mascu~
     2 C-3PO       167    75 UNKNOWN     gold       yellow         112   none  mascu~
     3 R2-D2        96    32 UNKNOWN     white, bl~ red             33   none  mascu~
     4 Darth V~    202   136 none        white      yellow          41.9 male  mascu~
     5 Leia Or~    150    49 brown       light      brown           19   fema~ femin~
     6 Owen La~    178   120 brown, grey light      blue            52   male  mascu~
     7 Beru Wh~    165    75 brown       light      blue            47   fema~ femin~
     8 R5-D4        97    32 UNKNOWN     white, red red             NA   none  mascu~
     9 Biggs D~    183    84 black       light      brown           24   male  mascu~
    10 Obi-Wan~    182    77 auburn, wh~ fair       blue-gray       57   male  mascu~
    # ... with 77 more rows, and 5 more variables: homeworld <chr>, species <chr>,
    #   films <list>, vehicles <list>, starships <list>
    
    #fill
    gap_data
    # A tibble: 9 x 4
      site       species        sample_num bees_present
      <chr>      <chr>               <dbl> <lgl>       
    1 Bilpin     A. longiforlia          1 TRUE        
    2 NA         NA                      2 TRUE        
    3 NA         NA                      3 TRUE        
    4 NA         A. elongata             1 TRUE        
    5 NA         NA                      2 FALSE       
    6 NA         NA                      3 TRUE        
    7 Grose Vale A. terminalis           1 FALSE       
    8 NA         NA                      2 FALSE       
    9 NA         NA                      2 TRUE   
    gap_data %>% 
      fill(site,species)
    # A tibble: 9 x 4
      site       species        sample_num bees_present
      <chr>      <chr>               <dbl> <lgl>       
    1 Bilpin     A. longiforlia          1 TRUE        
    2 Bilpin     A. longiforlia          2 TRUE        
    3 Bilpin     A. longiforlia          3 TRUE        
    4 Bilpin     A. elongata             1 TRUE        
    5 Bilpin     A. elongata             2 FALSE       
    6 Bilpin     A. elongata             3 TRUE        
    7 Grose Vale A. terminalis           1 FALSE       
    8 Grose Vale A. terminalis           2 FALSE       
    9 Grose Vale A. terminalis           2 TRUE     
    

    if_else

    library(readxl)
    df=read_xlsx("datas/ExamDatas_NAs.xlsx")
    df
    # A tibble: 50 x 8
       class name   sex   chinese  math english moral science
       <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
     1 六1班 何娜   女         87    92      79     9      10
     2 六1班 黄才菊 女         95    77      75    NA       9
     3 六1班 陈芳妹 女         79    87      66     9      10
     4 六1班 陈学勤 男         NA    79      66     9      10
     5 六1班 陈祝贞 女         76    79      67     8      10
     6 六1班 何小薇 女         83    73      65     8       9
     7 六1班 雷旺   男         NA    80      68     8       9
     8 六1班 陈欣越 男         57    80      60     9       9
     9 六1班 黄亦婷 女         77    NA      54     8      10
    10 六1班 陈媚   女         68    55      66     8       9
    # ... with 40 more rows
    
    
    df %>% 
      mutate(sex=if_else(sex=="男","M","F"))
    # A tibble: 50 x 8
       class name   sex   chinese  math english moral science
       <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
     1 六1班 何娜   F          87    92      79     9      10
     2 六1班 黄才菊 F          95    77      75    NA       9
     3 六1班 陈芳妹 F          79    87      66     9      10
     4 六1班 陈学勤 M          NA    79      66     9      10
     5 六1班 陈祝贞 F          76    79      67     8      10
     6 六1班 何小薇 F          83    73      65     8       9
     7 六1班 雷旺   M          NA    80      68     8       9
     8 六1班 陈欣越 M          57    80      60     9       9
     9 六1班 黄亦婷 F          77    NA      54     8      10
    10 六1班 陈媚   F          68    55      66     8       9
    # ... with 40 more rows
    
    #case_when
    df %>% 
      mutate(math=
               case_when(math >= 75 ~ "High",
                         math >= 60 ~ "Middle",
                         TRUE ~ "Low"))
    # A tibble: 50 x 8
       class name   sex   chinese math   english moral science
       <chr> <chr>  <chr>   <dbl> <chr>    <dbl> <dbl>   <dbl>
     1 六1班 何娜   女         87 High        79     9      10
     2 六1班 黄才菊 女         95 High        75    NA       9
     3 六1班 陈芳妹 女         79 High        66     9      10
     4 六1班 陈学勤 男         NA High        66     9      10
     5 六1班 陈祝贞 女         76 High        67     8      10
     6 六1班 何小薇 女         83 Middle      65     8       9
     7 六1班 雷旺   男         NA High        68     8       9
     8 六1班 陈欣越 男         57 High        60     9       9
     9 六1班 黄亦婷 女         77 Low         54     8      10
    10 六1班 陈媚   女         68 Low         66     8       9
    # ... with 40 more rows
    

    参考:张敬信老师:R语言编程

    相关文章

      网友评论

          本文标题:2022-07-16 tidyverse 常见函数select、

          本文链接:https://www.haomeiwen.com/subject/hoyhirtx.html