使用apply在R中的多个列上运行函数
我正在尝试收集一些变量(列)的汇总统计数据,这些变量已经被分类变量分组。我希望使用使用apply在R中的多个列上运行函数,r,R,我正在尝试收集一些变量(列)的汇总统计数据,这些变量已经被分类变量分组。我希望使用apply函数,而不是为每个变量单独编写代码 下面是我想使用的函数,不添加任何应用程序: library(dplyr) group_by(my_data, group) %>% summarise( count = n(), mean = mean(weight, na.rm = TRUE), sd = sd(weight, na.rm = TRUE) ) 我知道这是一个相当
apply
函数,而不是为每个变量单独编写代码
下面是我想使用的函数,不添加任何应用程序:
library(dplyr)
group_by(my_data, group) %>%
summarise(
count = n(),
mean = mean(weight, na.rm = TRUE),
sd = sd(weight, na.rm = TRUE)
)
我知道这是一个相当新的问题,但我正在使用各种应用教程努力解决它。我觉得这件事很棘手,因为有管道
干杯 baser:
data.frame(do.call("rbind", lapply(split(df, df$car_brand), function(x){
data.frame(
car_brand = x$car_brand,
counter = nrow(x),
avg = mean(x$hp, na.rm = T),
std_dev = ifelse(is.na(sd(x$hp, na.rm = T)), 0, sd(x$hp, na.rm = T)))
}
)
),
row.names = NULL
)
数据:
df <- data.frame(car_type = row.names(mtcars),
car_brand = gsub(" .*", "", row.names(mtcars)),
mtcars, row.names = NULL)
df基于公式的函数,例如lm
,aov
等,在group\u by
方面存在问题,如您所见,因此,这里有一种方法使用purr::map.*
和group\u split
library(dplyr)
library(purrr)
nms <- c('wt','qsec')
#loop over nms and apply the 2nd part, so .x will take 'wt' then `qsec`
map_dfc(nms,
~mtcars %>%
group_split(cyl) %>%
map_df(function(y) y %>%
summarise(!!quo_name(paste0("mean_",.x)):=mean(y[[.x]]),
!!quo_name(paste0("pval_",.x)):=summary(aov(as.formula(paste(.x,"~am")), data=y))[[1]]$`Pr(>F)`[1]
)
)
)
# A tibble: 3 x 4
mean_wt pval_wt mean_qsec pval_qsec
<dbl> <dbl> <dbl> <dbl>
1 2.29 0.0104 19.1 0.0166
2 3.12 0.00101 18.0 0.00514
3 4.00 0.218 16.8 0.000834
库(dplyr)
图书馆(purrr)
nms%
组分割(气缸)%>%
map_df(功能(y)y%>%
总结(!!quo_名称(粘贴0(“平均值,.x)):=平均值(y[.x]]),
!!quo_name(paste0(“pval_”),.x)):=summary(aov(as.formula(paste(.x,“~am”)),data=y))[[1]]$`Pr(>F)`[1]
)
)
)
#一个tibble:3x4
平均值pval平均值pval平均值qsec
1 2.29 0.0104 19.1 0.0166
2 3.12 0.00101 18.0 0.00514
3 4.00 0.218 16.8 0.000834
请参见
处的总结和总结所有非常有效,谢谢!作为另外一个问题,我现在想对上述各组的每个变量进行方差分析,而无需重新编写代码。可能吗?