本节继续来介绍
tidyverse
中的重要函数across
,需要更新至 dplyr-1-0-0
across()它可以轻松地对多列执行相同的操作
across() 有两个主要参数:
- 第一个参数.cols选择要操作的列
- 第二个参数.fns是要应用于每一列的一个函数或函数列表
创建数据
gdf <- tibble(g = c(1,1,2,3),v1 = 10:13,v2 = 20:23,v3=1:4)
gdf
g v1 v2 v3
<dbl> <int> <int> <int>
1 1 10 20 1
2 1 11 21 2
3 2 12 22 3
4 3 13 23 4
给每一列加1
gdf %>% mutate(across(v1:v3, ~ .x +1))
g v1 v2 v3
<dbl> <dbl> <dbl> <dbl>
1 1 11 21 2
2 1 12 22 3
3 2 13 23 4
4 3 14 24 5
前两列四舍五入
iris %>%
as_tibble() %>%
mutate(across(c(1,2),round))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 5 4 1.4 0.2 setosa
2 5 3 1.4 0.2 setosa
3 5 3 1.3 0.2 setosa
还有如下2种写法
iris %>%
as_tibble() %>%
mutate(across(1:Sepal.Width, round))
iris %>%
as_tibble() %>%
mutate(across(where(is.double) & !c(Petal.Length, Petal.Width), round))
按列求均值
iris %>% summarize(across(is.numeric,mean))
按行求和
iris %>% as_tibble() %>%
rowwise() %>%
mutate(mean = sum(across(where(is.numeric))))
分组求均值
iris %>%
group_by(Species) %>%
summarise(across(starts_with("Sepal"), ~ mean(.x, na.rm = TRUE)))
Species Sepal.Length Sepal.Width
<fct> <dbl> <dbl>
1 setosa 5.01 3.43
2 versicolor 5.94 2.77
3 virginica 6.59 2.97
分组求和
iris %>%
group_by(Species) %>%
summarise(across(starts_with("Sepal"), ~ sum(.x, na.rm=TRUE)))
Species Sepal.Length Sepal.Width
<fct> <dbl> <dbl>
1 setosa 250. 171.
2 versicolor 297. 138.
3 virginica 329. 149.
iris %>%
group_by(Species) %>%
summarise(across(starts_with("Sepal"), list(mean = mean, sd = sd)))
Species Sepal.Length_mean Sepal.Length_sd Sepal.Width_mean Sepal.Width_sd
<fct> <dbl> <dbl> <dbl> <dbl>
1 setosa 5.01 0.352 3.43 0.379
2 versicolor 5.94 0.516 2.77 0.314
3 virginica 6.59 0.636 2.97 0.322
使用.name参数控制输出名
iris %>%
group_by(Species) %>%
summarise(across(starts_with("Sepal"), mean, .names = "mean_{.col}"))
Species mean_Sepal.Length mean_Sepal.Width
<fct> <dbl> <dbl>
1 setosa 5.01 3.43
2 versicolor 5.94 2.77
3 virginica 6.59 2.97
筛选没有缺失值的行
starwars %>% filter(across(everything(), ~ !is.na(.x)))
使用时mutate(),所有转换across()都将立即应用
df <- tibble(x = 2, y = 4, z = 8)
df %>% mutate(across(everything(), ~ .x / y))
x y z
<dbl> <dbl> <dbl>
1 0.5 1 2
统计字符长度
starwars %>%
summarise(across(where(is.character), ~ length(unique(.x))))
name hair_color skin_color eye_color sex gender homeworld species
<int> <int> <int> <int> <int> <int> <int> <int>
1 87 13 31 15 5 3 49 38
统计列最小/最大值
min_max <- list(
min = ~min(.x, na.rm = TRUE),
max = ~max(.x, na.rm = TRUE)
)
iris %>% summarise(across(where(is.numeric),min_max))
Sepal.Length_min Sepal.Length_max Sepal.Width_min Sepal.Width_max Petal.Length_min Petal.Length_max Petal.Width_min Petal.Width_max
1 4.3 7.9 2 4.4 1 6.9 0.1 2.5
喜欢的小伙伴欢迎关注我的公众号
R语言数据分析指南,持续分享数据可视化的经典案例及一些生信知识,希望对大家有所帮助