我知道在这个论坛中提供了许多答案,关于如何使用 aggregate
, ddply
或 data.table
等选项获取多个组的摘要统计信息(例如,mean,se,N) . 但是,我不确定如何在多个列上同时应用这些函数 .
更具体地说,我想知道如何在多列(dv1,dv2,dv3)上扩展以下 ddply
命令,而无需每次都重新键入具有不同变量名的代码 .
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 ...?我认为this可能是解决方案:
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等人......)
3 回答
以下是首先重塑数据的说明 . 我编写了一个自定义函数来提高可读性:
或者没有自定义功能,感谢@Jaap
如果你不想
melt
成长格式,你也可以这样做:这使:
这是使用
dplyr
的解决方案 . 这给出了"wide"格式的结果(即dv1,dv2,dv3的统计数据在同一行上) .如果需要在单独的行上具有dv1,dv2和dv3的统计数据,可以使用
melt
或gather
(来自tidyr
)进行修改 .