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

2022-07-16  本文已影响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语言编程

上一篇 下一篇

猜你喜欢

热点阅读