如何在R中简洁地同时汇总多个独立变量?
同时汇总多个变量的简洁方法
你目前通过两次调用ddply再合并的方式确实可以实现需求,但可以通过以下几种更简洁的方式一次性完成多变量汇总:
方法1:在plyr的summarise中直接同时计算多变量
不用拆分两次处理,直接在同一个ddply调用里对Yield和Protein分别计算统计量,变量名也更清晰:
library(plyr) data_summary <- ddply(dataA, c("Cultivar", "Nitrogen"), summarise, # Yield相关统计量 Yield_mean = mean(Yield), Yield_sd = sd(Yield), Yield_n = length(Yield), Yield_se = Yield_sd / sqrt(Yield_n), # Protein相关统计量 Protein_mean = mean(Protein), Protein_sd = sd(Protein), Protein_n = length(Protein), Protein_se = Protein_sd / sqrt(Protein_n))
运行后得到的结果和你原来的逻辑一致,但变量名更明确,避免了原代码中mean同时对应两个指标的歧义。
方法2:用tidyverse(dplyr+tidyr)实现灵活的多变量汇总
如果后续需要扩展更多待汇总的变量,这种方法扩展性更强,先把宽表转长,分组统计后再转回宽表:
library(tidyverse) data_summary <- dataA %>% # 保留分组变量和需要汇总的指标 select(Cultivar, Nitrogen, Yield, Protein) %>% # 宽表转长表,将Yield和Protein转为变量列 pivot_longer(cols = c(Yield, Protein), names_to = "Variable", values_to = "Value") %>% # 按分组变量和指标分组 group_by(Cultivar, Nitrogen, Variable) %>% # 计算统计量 summarise(mean = mean(Value), sd = sd(Value), n = n(), se = sd / sqrt(n)) %>% # 长表转宽表,恢复类似原结果的格式 pivot_wider(names_from = Variable, values_from = c(mean, sd, n, se), names_sep = "_")
这种方式的好处是,哪怕后续要加10个指标,只需要在pivot_longer的cols参数里新增变量名即可,无需修改统计逻辑部分。
方法3:用data.table实现高效汇总
如果你的数据集很大,data.table的运行效率会比plyr更高,语法也更简洁:
library(data.table) # 将data.frame转为data.table setDT(dataA) # 按Cultivar和Nitrogen分组计算 data_summary <- dataA[, .( Yield_mean = mean(Yield), Yield_sd = sd(Yield), Yield_n = .N, # .N代表当前分组的行数 Yield_se = Yield_sd / sqrt(Yield_n), Protein_mean = mean(Protein), Protein_sd = sd(Protein), Protein_n = .N, Protein_se = Protein_sd / sqrt(Protein_n) ), by = .(Cultivar, Nitrogen)]
示例结果(以方法1为例)
Cultivar Nitrogen Yield_mean Yield_sd Yield_n Yield_se Protein_mean Protein_sd Protein_n Protein_se 1 CV1 N0 99 10.00000 3 5.77350 35.000 10.00000 3 5.77350 2 CV1 N1 130 13.74773 3 7.93725 44.000 11.0000 3 6.35085 3 CV1 N2 140 18.08314 3 10.44031 40.000 18.0831 3 10.44031 4 CV1 N3 138 12.52996 3 7.23418 38.000 12.52996 3 7.23418 5 CV2 N0 95 11.53256 3 6.65833 55.000 35.6651 3 20.59935 6 CV2 N1 123 5.29150 3 3.05505 41.000 25.9422 3 15.01111 7 CV2 N2 151 5.19615 3 3.00000 48.6667 4.7258 3 2.72845 8 CV2 N3 164 12.12436 3 7.00000 64.000 12.12436 3 7.00000
内容的提问来源于stack exchange,提问作者J.K Kim
相关产品推荐
相关产品推荐

