R函数应用于按多个因子分组的数据帧

时间:2014-11-20 20:20:35

标签: r

我有一个名为subdata的数据框,其尺寸为10299 x 81.第1列称为" Subject"和第2列称为"活动"。我想计算按&#34分组的每列的平均值;主题"和"活动"。

以下是我尝试过的功能,到目前为止它们似乎都没有。最后我用了colwise(mean)函数,看起来很有效。我是R的新手,刚刚学习了sapplylapplytapply函数,似乎函数在列中起作用。

任何人都可以帮我解释这些错误或警告信息的含义以及是否有办法使这些功能有效?

使用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(mean)函数,似乎工作

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

1 个答案:

答案 0 :(得分: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))

虽然您可能希望rbind此输出并重新分配rownames以对应组。但是,为此目的,最好只使用aggregate来避免这种额外的计算。

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

您的ddply语句已结束,但正如我上面建议的那样,您应该使用numcolwise对您的numeric列进行总结。

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