【发布时间】:2016-01-11 14:06:22
【问题描述】:
我知道这个论坛提供了很多关于如何使用aggregate、ddply 或data.table 等选项获取多个组的汇总统计数据(例如均值、se、N)的答案。但是,我不确定如何一次将这些函数应用于多个列。
更具体地说,我想知道如何将以下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...?我认为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))
看起来方向正确,但不完全是我需要的。此解决方案分别提供每个组的统计信息。我需要数据 1 中的结果(例如,第一个聚合组是 A、E 和 I 组的人;第二个是 B、E 和 I 组的人等......)
【问题讨论】:
-
一种方法(如果您的数据不是太大)是首先使用“measure.vars”作为“c("dv1","dv2","dv3") 来融合您的数据。然后您可以重复使用您的代码,但添加一个按变量拆分并计算价值摘要。
-
由于您使用
cbind创建数据框,并且它需要一个参数向量(在您的情况下其中一些是字符串),因此所有参数都被转换为字符串。您可以使用以下代码my.dat <- data.frame(group1, group2, group3, dv1=rnorm(24),dv2=rnorm(24),dv3=rnorm(24))更改创建数据框的方式。您应该能够删除对 lapply 的调用以转换为数字。