假设我在R中有一个数据框,我想使用2列" factor1"和" factor2"作为因素,我需要计算每对上述因素的所有其他列的平均值。运行下面的代码后,最后一行给出以下警告:
Warning messages:
1: In split.default(seq_along(x), f, drop = drop, ...) :
data length is not a multiple of split variable
...
为什么会发生这种情况,我该怎么做才能做到正确? 感谢。
这是我的代码:
# Create data frame
myDataFrame <- data.frame(factor1=c(1,1,1,2,2,2,3,3,3), factor2=c(3,3,3,4,4,4,5,5,5), val1=c(1,2,3,4,5,6,7,8,9), val2=c(9,8,7,6,5,4,3,2,1))
# Split by 2 columns (factors)
splitDataFrame <- split(myDataFrame, list(myDataFrame$factor1, mydataFrame$factor2))
# Calculate mean value for each column per each pair of factors
splitMeanValues <- lapply(splitDataFrame, function(x) apply(x, 2, mean))
# Combine back to reduced table whereas there is only one value (mean) per each pair of factors
MeanValues <- unsplit(splitMeanValues, list(unique(myDataFrame$factor1), unique(mydataFrame$factor2)))
EDIT1:添加了数据框创建(见上文)
答案 0 :(得分:1)
如果您需要计算除因子之外的所有其他列的平均值,您可以使用aggregate()
的公式语法
aggregate(.~factor1+factor2, myDataFrame, FUN=mean)
返回
factor1 factor2 val1 val2
1 1 3 2 8
2 2 4 5 5
3 3 5 8 2
您的split()
方法无法正常工作,因为当您unsplit
时,您必须拥有与拆分数据时相同的行数。您将所有组的行数减少到只有一行。另外,unsplit
确实应该与用于执行split
的完全相同的因子列表一起使用,否则组可能会出现故障。您可以使用split
然后lapply
某些折叠函数,然后将rbind
列表重新转换为单个data.frame(如果您真的想要),但简单来说,{{1}可能是最好的。
答案 1 :(得分:1)
summaryBy()
包中的doBy
可以获得相同的结果。虽然在这种情况下它与aggregate()
几乎相同。
> library(doBy)
> summaryBy( . ~ factor1+factor2, data = myDataFrame)
# factor1 factor2 val1.mean val2.mean
# 1 1 3 2 8
# 2 2 4 5 5
# 3 3 5 8 2
答案 2 :(得分:0)
您是否尝试过aggregate
?
aggregate(myDataFrame$valueColum, myDataFrame$factor1, FUN=mean)
aggregate(myDataFrame$valueColum, myDataFrame$factor2, FUN=mean)