R:data.frame的聚合列

时间:2010-07-27 22:26:25

标签: r dataframe

我有一个看起来像这样的data.frame

> head(df)
            Memory    Memory    Memory    Memory    Memory     Naive     Naive
10472501  6.075714  5.898929  6.644946  6.023901  6.332126  8.087944  7.520194
10509163  6.168941  6.495393  5.951124  6.052527  6.404401  7.152890  8.335509
10496091 10.125575  9.966211 10.075613 10.310952 10.090649 11.803949 11.274480
10427035  6.644921  6.658567  6.569745  6.499243  6.990852  8.010784  7.798154
10503695  8.379494  8.153917  8.246484  8.390747  8.346748  9.540236  9.091740
10451763 10.986717 11.233819 10.643245 10.230697 10.541396 12.248487 11.823138  

我希望找到Memory列的平均值和Naive列的平均值。 aggregate函数聚合行。此data.frame可能会包含大量行,因此在原始aggregate的{​​{1}}之后应用colnames进行转置会让我感觉不好,并且通常很烦人:

data.frame

我错过了一件令人眼花缭乱的明显事情?

5 个答案:

答案 0 :(得分:8)

我是重新格式化数据的主要倡导者,因此它采用“长”格式。当涉及到像这样的问题时,长格式的效用尤其明显。幸运的是,使用reshape包将这样的数据重新整形成几乎任何格式都很容易。

如果我理解你的问题,你需要每行MemoryNaive的平均值。无论出于何种原因,我们都需要为reshape::melt()创建唯一的列名。

colnames(df) <- paste(colnames(df), 1:ncol(df), sep = "_")

然后,您必须创建一个ID列。你可以做

df$ID <- 1:nrow(df)

或者,如果这些rownames是有意义的

df$ID <- rownames(df)

现在,使用reshape

library(reshape)
df.m <- melt(df, id = "ID")
df.m <- cbind(df.m, colsplit(df.m$variable, split = "_", names = c("Measure", "N")))
df.agg <- cast(df.m, ID ~ Measure, fun = mean)

df.agg现在应该看起来像你想要的输出snippit。

或者,如果你只想要所有行的总体平均值,那么Zack的建议就可以了。像

这样的东西
m <- colMeans(df)
tapply(m, colnames(df), mean)

您可以获得相同的结果,但格式化为带有

的数据框
cast(df.m, .~variable, fun = mean)

答案 1 :(得分:4)

这样的东西
l <-lapply(unique(colnames(df)), function(x) rowMeans(df[,colnames(df) == x]))



df <- do.call(cbind.data.frame, l)

答案 2 :(得分:3)

澄清Jonathan Chang的回答......你遗漏的一个明显的事情就是你可以选择列并发出rowMeans命令。那将为每一行提供均值的向量。他的命令获取每组唯一列名的行方式,这正是我要编写的内容。使用您的示例数据,他的命令结果是两个列表。

rowMeans也非常快。

要将其分解,仅获取所有内存列的方法只是

rowMeans(df[,colnames(df) == 'Memory']) #or from you example, rowMeans(df[,1:5])

这是最简单的完整正确答案,如果您愿意,请将他投票并标记为正确。

(顺便说一下,我也很喜欢Jo的建议,即保留一些长篇数据。)

答案 3 :(得分:0)

我认为你已经加载了没有header=TRUE的数据,而你拥有的是一个因子矩阵,因此你的一般好主意就会失败。

答案 4 :(得分:0)

m = matrix(1:12,3)
colnames(m) = c(1,1,2,2)

m

     1 1 2  2
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

mt = t(m)
sapply(by(mt,rownames(mt),colMeans),identity)

     1    2
V1 2.5  8.5
V2 3.5  9.5
V3 4.5 10.5