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语言编程
网友评论