2014-11-20 56 views
0

我有一个名为subdata的数据框,其维数为10299 x 81.列1称为“主题”,列2称为“活动”。我想计算按“主题”和“活动”分组的每列的平均值。将R函数应用于按多种因素分组的数据框

以下是我尝试过的功能,目前看起来没有任何功能。最后我使用了colwise(mean)函数,它似乎工作。我是R新手,刚学过sapply,lapply,tapply函数,它似乎是平均函数在列中工作。

任何人都可以帮我解释一下这些错误或警告信息是什么意思,以及是否有一种方法可以使这些函数起作用?

使用lapply功能:

newdata<- subdata[, lapply(.SD, mean), by = c("Subject","Activity")] 

错误消息:

Error in `[.data.frame`(subdata, , lapply(.SD, mean), by = c("Subject", : 
unused argument (by = c("Subject", "Activity")) 

使用的功能:

newdata<-by(subdata, list(subdata$Subject, subdata$Activity), mean) 

我得到了警告消息:

Warning messages: 
1: In mean.default(data[x, , drop = FALSE], ...) : 
    argument is not numeric or logical: returning NA 

然后我plyr包ddply试图

ddply(subdata, .(Subject, Activity), mean) 

我得到了相同的警告信息:

Warning messages: 
1: In mean.default(piece, ...) : argument is not numeric or logical: returning NA 0 

最后我用colwise(平均)功能,它似乎工作

newdata<-ddply(subdata, .(Subject, Activity), colwise(mean)) 
+0

与您的最后一个选项,尝试'numcolwise(mean)'而不是'colwise(mean) – cdeterman 2014-11-20 20:38:41

回答

1

用数据集的代表性样本来确定有些困难。让我们创建一些数据来处理。

# Create some random demo data 
subdata <- data.frame(Subject = rep(seq(5), each=4), 
        Activity = rep(LETTERS[1:2], 10), v1=rnorm(20), v2=rnorm(20)) 

您的第一次尝试我甚至不知道从哪里开始。看起来你正试图将你的数据框与列表的输出进行子集化,这看起来很奇怪。你应该放弃这种尝试。

您的by语句提供有关非数字数据的错误。这是因为by功能不是那么聪明。您只需要提供要分析的列,然后提供索引(即您的因子列)。

by(subdata[,-c(1,2)], list(subdata$Subject, subdata$Activity), function(x) colMeans(x)) 

Althought你可能想rbind此输出并重新分配rownames对应团体。但是,为此目的,最好仅使用aggregate来避免这种额外的计算。

aggregate(subdata[,-c(1,2)], list(subdata$Subject, subdata$Activity), mean) 

ddply陈述接近,但正如我上面建议你应该使用numcolwisenumeric列进行汇总。

library(plyr) 
# summarize over all numeric columns 
ddply(subdata, .(Subject, Activity), numcolwise(mean)) 
相关问题