7

我有一个看起来像这样的 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可能有大量的行,因此转置然后aggregatecolnames原件应用data.frame让我觉得很糟糕,而且通常很烦人:

> head(t(aggregate(t(df),list(colnames(df)), mean)))
         [,1]       [,2]      
Group.1  "Memory"   "Naive"   
10472501 "6.195123" "8.125439"
10509163 "6.214477" "7.733625"
10496091 "10.11380" "11.55348"
10427035 "6.672665" "8.266854"
10503695 "8.303478" "9.340436"

我错过了什么明显的东西?

4

5 回答 5

8

我大力提倡重新格式化数据,使其采用“长”格式。当涉及到这样的问题时,长格式的实用性尤其明显。幸运的是,使用reshape包将这样的数据重塑为几乎任何格式都很容易。

Memory如果我理解你的问题是正确的,你想要Naive每一行的平均值。无论出于何种原因,我们都需要使列名对reshape::melt().

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

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

df$ID <- 1:nrow(df)

或者,如果这些行名有意义

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现在应该看起来像您想要的输出片段。

或者,如果您只想要所有行的整体均值,Zack 的建议会奏效。就像是

m <- colMeans(df)
tapply(m, colnames(df), mean)

你可以得到相同的结果,但格式化为一个数据框

cast(df.m, .~variable, fun = mean)
于 2010-07-28T00:17:36.690 回答
4

怎么样的东西

l <-lapply(unique(colnames(df)), function(x) rowMeans(df[,colnames(df) == x]))



df <- do.call(cbind.data.frame, l)
于 2010-07-27T23:37:20.973 回答
3

为了澄清 Jonathan Chang 的答案......您缺少的显而易见的事情是您可以只选择列并发出 rowMeans 命令。这将给出每行均值的向量。他的命令获取每组唯一列名的行均值,这正是我要写的。使用您的示例数据,他的命令的结果是两个列表。

rowMeans 也非常快。

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

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

这是最简单的完整正确答案,如果您喜欢,请投票给他并标记他是正确的。

(顺便说一句,我也喜欢 Jo 的建议,即一般将事物保留为长数据。)

于 2010-07-28T01:15:10.420 回答
0

我认为你已经加载了你的数据,header=TRUE而你所拥有的是一个因子矩阵,所以你通常的好主意失败了。

于 2010-07-27T22:53:08.447 回答
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
于 2014-06-16T03:29:10.060 回答