我知道,有在这个论坛上如何获得汇总统计提供了很多的答案(例如,平均值,SE,N)为多组使用选项,如aggregate
,ddply
或data.table
.但是,我不确定如何在多个列上同时应用这些函数.
更具体地说,我想知道如何ddply
在多列(dv1,dv2,dv3)上扩展以下命令,而无需每次都重新键入具有不同变量名的代码.
library(reshape2) library(plyr) group1 <- c(rep(LETTERS[1:4], c(4,6,6,8))) group2 <- c(rep(LETTERS[5:8], c(6,4,8,6))) group3 <- c(rep(LETTERS[9:10], c(12,12))) my.dat <- data.frame(group1, group2, group3, dv1=rnorm(24),dv2=rnorm(24),dv3=rnorm(24)) my.dat data1 <- ddply(my.dat, c("group1", "group2","group3"), summarise, N = length(dv1), mean = mean(dv1,na.rm=T), sd = sd(dv1,na.rm=T), se = sd / sqrt(N) ) data1
如何ddply
在多个列上应用此函数,以便结果将是每个结果变量的data1,data2,data3 ...?我认为这可能是解决方案:
dfm <- melt(my.dat, id.vars = c("group1", "group2","group3")) lapply(list(.(group1, variable), .(group2, variable),.(group3, variable)), ddply, .data = dfm, .fun = summarize, mean = mean(value), sd = sd(value), N=length(value), se=sd/sqrt(N))
看起来它是在正确的方向,但不完全是我需要的.此解决方案分别提供每个组的统计信息.我需要的结果与data1相同(例如,第一个聚合组是A,E和I的人;第二个是B组,E组和I组等...)
以下是首先重塑数据的说明.我编写了一个自定义函数来提高可读性:
mysummary <- function(x,na.rm=F){ res <- list(mean=mean(x, na.rm=na.rm), sd=sd(x,na.rm=na.rm), N=length(x)) res$se <- res$sd/sqrt(res$N) res } library(data.table) res <- melt(setDT(my.dat),id.vars=c("group1","group2","group3"))[,mysummary(value), by=.(group1,group2,group3,variable)] > head(res) group1 group2 group3 variable mean sd N se 1: A E I dv1 9.75 6.994045 4 3.497023 2: B E I dv1 9.50 7.778175 2 5.500000 3: B F I dv1 16.00 4.082483 4 2.041241 4: C G I dv1 14.50 10.606602 2 7.500000 5: C G J dv1 10.75 10.372239 4 5.186119 6: D G J dv1 13.00 4.242641 2 3.000000
或者没有自定义功能,感谢@Jaap
melt(setDT(my.dat), id=c("group1","group2","group3"))[, .(mean = mean(value), sd = sd(value), n = .N, se = sd(value)/sqrt(.N)), .(group1, group2, group3, variable)]