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

2022-07-16 tidyverse 常见函数filter

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

filter()根据条件筛选行

set.seed(123)
df_dup=df %>% 
  slice_sample(n=60,replace = TRUE)
# A tibble: 60 x 8
   class name   sex   chinese  math english moral science
   <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
 1 六4班 李小龄 男         90    87      69    10      10
 2 六2班 雷开茂 男         83    NA      45     9       7
 3 六5班 胡玉洁 女         74    61      52     9       6
 4 六1班 何小薇 女         83    73      65     8       9
 5 六2班 陈华健 男         92    84      70     9      10
 6 六2班 黄菲   女         90    41      40     6       7
 7 六3班 江佳欣 女         80    69      NA     6       5
 8 六5班 符苡榕 女         85    89      76     9      NA
 9 六3班 罗光菊 女         44    NA      66     6       8
10 六5班 韦孟   男         58    66      65     7       9
# ... with 50 more rows
df_dup %>% 
  filter(sex=="男",math>80)
# A tibble: 4 x 8
  class name   sex   chinese  math english moral science
  <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
1 六4班 李小龄 男         90    87      69    10      10
2 六2班 陈华健 男         92    84      70     9      10
3 六4班 李小龄 男         90    87      69    10      10
4 六4班 杨昌晟 男         84    85      64     8      10
df_dup %>% 
  filter(between(math,80,90))
# A tibble: 15 x 8
   class name   sex   chinese  math english moral science
   <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
 1 六4班 李小龄 男         90    87      69    10      10
 2 六2班 陈华健 男         92    84      70     9      10
 3 六5班 符苡榕 女         85    89      76     9      NA
 4 六1班 陈欣越 男         57    80      60     9       9
 5 六4班 李小龄 男         90    87      69    10      10
 6 六2班 黄祖娜 女         94    88      75    10      10
 7 六5班 陆曼   女         88    84      69     8      10
 8 六1班 雷旺   男         NA    80      68     8       9
 9 六4班 杨昌晟 男         84    85      64     8      10
10 六2班 黄祖娜 女         94    88      75    10      10
11 六5班 符苡榕 女         85    89      76     9      NA
12 六2班 杨远芸 女         93    80      68     9      10
13 六5班 符苡榕 女         85    89      76     9      NA
14 六5班 陆曼   女         88    84      69     8      10
15 六5班 符芳盈 NA         58    85      48     9      10

slice_*()对行进行切片

df_dup %>% 
  slice_max(math,n=3)
# A tibble: 4 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 六5班 符苡榕 女         85    89      76     9      NA
3 六5班 符苡榕 女         85    89      76     9      NA
4 六5班 符苡榕 女         85    89      76     9      NA

filter()删除行

df_dup %>% 
  distinct()
# A tibble: 35 x 8
   class name   sex   chinese  math english moral science
   <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
 1 六4班 李小龄 男         90    87      69    10      10
 2 六2班 雷开茂 男         83    NA      45     9       7
 3 六5班 胡玉洁 女         74    61      52     9       6
 4 六1班 何小薇 女         83    73      65     8       9
 5 六2班 陈华健 男         92    84      70     9      10
 6 六2班 黄菲   女         90    41      40     6       7
 7 六3班 江佳欣 女         80    69      NA     6       5
 8 六5班 符苡榕 女         85    89      76     9      NA
 9 六3班 罗光菊 女         44    NA      66     6       8
10 六5班 韦孟   男         58    66      65     7       9
# ... with 25 more rows

df_dup %>% 
  distinct(sex,.keep_all = TRUE) #默认只返回选择的列,要返回所有列,需设置参数 .keep_all=TRUE
# A tibble: 3 x 8
  class name   sex   chinese  math english moral science
  <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
1 六4班 李小龄 男         90    87      69    10      10
2 六5班 胡玉洁 女         74    61      52     9       6
3 六5班 符芳盈 NA         58    85      48     9      10

删除包含NA的行

df_dup %>% 
  drop_na()
# A tibble: 38 x 8
   class name   sex   chinese  math english moral science
   <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
 1 六4班 李小龄 男         90    87      69    10      10
 2 六5班 胡玉洁 女         74    61      52     9       6
 3 六1班 何小薇 女         83    73      65     8       9
 4 六2班 陈华健 男         92    84      70     9      10
 5 六2班 黄菲   女         90    41      40     6       7
 6 六5班 韦孟   男         58    66      65     7       9
 7 六3班 何诗婷 女         76    53      72     9      10
 8 六4班 林典鲁 男         82    65      48     8       9
 9 六3班 何诗婷 女         76    53      72     9      10
10 六5班 容唐   女         83    71      56     9       7
# ... with 28 more rows
df_dup %>%  #也可只删除某些列包含NA的行
  drop_na(math,english)
# A tibble: 53 x 8
   class name   sex   chinese  math english moral science
   <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
 1 六4班 李小龄 男         90    87      69    10      10
 2 六5班 胡玉洁 女         74    61      52     9       6
 3 六1班 何小薇 女         83    73      65     8       9
 4 六2班 陈华健 男         92    84      70     9      10
 5 六2班 黄菲   女         90    41      40     6       7
 6 六5班 符苡榕 女         85    89      76     9      NA
 7 六5班 韦孟   男         58    66      65     7       9
 8 六3班 何诗婷 女         76    53      72     9      10
 9 六4班 林典鲁 男         82    65      48     8       9
10 六3班 何诗婷 女         76    53      72     9      10
# ... with 43 more rows
###对行排序 arrange()
#默认是递增
df_dup %>% 
  arrange(math)
# A tibble: 60 x 8
   class name   sex   chinese  math english moral science
   <chr> <chr>  <chr>   <dbl> <dbl>   <dbl> <dbl>   <dbl>
 1 六3班 邹嘉伟 男         67    18      62     8      NA
 2 六3班 刘虹均 男         72    23      74     3       6
 3 六3班 陈逾革 男         47    24      67     2       5
 4 六3班 洪琦希 男         NA    31      69     6       4
 5 六3班 洪琦希 男         NA    31      69     6       4
 6 六3班 洪琦希 男         NA    31      69     6       4
 7 六2班 黄菲   女         90    41      40     6       7
 8 六3班 何诗婷 女         76    53      72     9      10
 9 六3班 何诗婷 女         76    53      72     9      10
10 六3班 何诗婷 女         76    53      72     9      10
# ... with 50 more rows
#递减排序
df_dup %>% 
  arrange(-math)
# A tibble: 60 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 六5班 符苡榕 女         85    89      76     9      NA
 3 六5班 符苡榕 女         85    89      76     9      NA
 4 六5班 符苡榕 女         85    89      76     9      NA
 5 六2班 黄祖娜 女         94    88      75    10      10
 6 六2班 黄祖娜 女         94    88      75    10      10
 7 六4班 李小龄 男         90    87      69    10      10
 8 六4班 李小龄 男         90    87      69    10      10
 9 六4班 杨昌晟 男         84    85      64     8      10
10 六5班 符芳盈 NA         58    85      48     9      10
# ... with 50 more rows

分组汇总

df %>% 
  group_by(sex) %>% 
  summarise(n=n(),
            math_avg=mean(math,na.rm=TRUE),
            math_med=median(math))

# A tibble: 3 x 4
  sex       n math_avg math_med
  <chr> <int>    <dbl>    <dbl>
1 男       24     64.6       NA
2 女       25     70.8       NA
3 NA        1     85         85
#分组计数
df %>% 
  count(class,sex,sort = TRUE)
# A tibble: 12 x 3
   class sex       n
   <chr> <chr> <int>
 1 六1班 女        7
 2 六4班 男        6
 3 六2班 男        5
 4 六3班 男        5
 5 六3班 女        5
 6 六5班 女        5
 7 六2班 女        4
 8 六4班 女        4
 9 六5班 男        4
10 六1班 男        3
11 六5班 NA        1
12 NA    男        1

按行汇总

#错误做法
df %>% 
  mutate(total=sum(c(chinese,math,english)))
# 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    NA
 2 六1班 黄才菊 女         95    77      75    NA       9    NA
 3 六1班 陈芳妹 女         79    87      66     9      10    NA
 4 六1班 陈学勤 男         NA    79      66     9      10    NA
 5 六1班 陈祝贞 女         76    79      67     8      10    NA
 6 六1班 何小薇 女         83    73      65     8       9    NA
 7 六1班 雷旺   男         NA    80      68     8       9    NA
 8 六1班 陈欣越 男         57    80      60     9       9    NA
 9 六1班 黄亦婷 女         77    NA      54     8      10    NA
10 六1班 陈媚   女         68    55      66     8       9    NA
# ... with 40 more rows
#正确做法
df %>% 
  rowwise() %>% 
  mutate(total=sum(c(chinese,math,english)))
# A tibble: 50 x 9
# Rowwise: 
   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   258
 2 六1班 黄才菊 女         95    77      75    NA       9   247
 3 六1班 陈芳妹 女         79    87      66     9      10   232
 4 六1班 陈学勤 男         NA    79      66     9      10    NA
 5 六1班 陈祝贞 女         76    79      67     8      10   222
 6 六1班 何小薇 女         83    73      65     8       9   221
 7 六1班 雷旺   男         NA    80      68     8       9    NA
 8 六1班 陈欣越 男         57    80      60     9       9   197
 9 六1班 黄亦婷 女         77    NA      54     8      10    NA
10 六1班 陈媚   女         68    55      66     8       9   189
# ... with 40 more rows
df %>% 
  mutate(total=rowSums(across(where(is.numeric))))
# 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
df %>% 
  rowwise(name) %>% 
  summarise(total=sum(across(where(is.numeric))))
# A tibble: 50 x 2
# Groups:   name [50]
   name   total
   <chr>  <dbl>
 1 何娜     277
 2 黄才菊    NA
 3 陈芳妹   251
 4 陈学勤    NA
 5 陈祝贞   240
 6 何小薇   238
 7 雷旺      NA
 8 陈欣越   215
 9 黄亦婷    NA
10 陈媚     206
# ... with 40 more rows

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

相关文章

网友评论

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

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