# across 函数
#以iris数据集为例
#library(tidyverse)
#计算所有变量的非缺失值的总数
count <- iris %>%
summarise_all(~sum(!is.na(.)))
#计算sepal.length,sepal.width,petal.length,petal.width非缺失值的均值
mean_ir <- iris %>%
summarise(
mean_l_sepal = mean(Sepal.Length,na.rm=T),
mean_w_sepal = mean(Sepal.Width,na.rm=T),
mean_l_petal = mean(Petal.Length,na.rm=T),
mean_w_petal = mean(Petal.Width,na.rm=T)
)
#上面的过程对于变量较少时,还可以,但是如果变量比较多,就很麻烦,可以用summarise_if简化过程
#以species为分组变量,计算所有数值变量的均值
mean_group <- iris %>%
group_by(Species) %>%
summarise_if(is.numeric,mean,na.rm=T)
## 函数的基本形式
across()函数,主要有三个参数:
across(.cols=,.fns,.names=)
.cols用来表示用户自定义的列(可以多选),选择的语法和select函数一致。
.fns表示用户需要运行的函数(可以多个),有三种形式可以选
1.function,例如sum,mean
2.purrr-style lamda,例如 ~mean(.x,na.rm=T)
3.list of functions/lambdas,例如,list(mean=mean,n_miss=~sum(is.na(.x)))
.names是函数得到结果的名字。
#计算所有变量的非缺失值的总数
counts <- iris %>%
summarise(
across(everything()& !Species ,function(x) sum(x,na.rm=T))
)
means <- iris %>%
summarise(
across(everything()& !Species,list(mean=mean,sd=sd),na.rm=T),
n = n()
)
# using across(),如果结果返回一行以上的数据,应该使用reframe,summarise会报错
quantile <- iris %>%
group_by(Species) %>%
reframe(
prob = c(.25, .75),
across(
ends_with("Length"),
~ quantile(., prob, na.rm = TRUE)
)
)