2011-03-26 72 views
2

我有一个20列的data.frame。前两个是因素,其余是数字。我想将前两列用作分割变量,然后将mean()应用于其余列。ddply如何处理“拆分”变量的因素?

对于ddply(),这看起来像一个快速简单的工作,但是,输出data.frame的结果并不是我正在寻找的。下面是只用一个数据的列的最小例如:

Aa <- c(rep(c("A", "a"), each = 20)) 
Bb <- c(rep(c("B", "b", "B", "b"), each = 10)) 
x <- runif(40) 
df1 <- data.frame(Aa, Bb, x) 

ddply(df1, .(Aa, Bb), mean) 

的输出是:

Aa Bb   x 
1 NA NA 0.5193275 
2 NA NA 0.4491907 
3 NA NA 0.4848128 
4 NA NA 0.4717899 
Warning messages: 
1: In mean.default(X[[1L]], ...) : 
    argument is not numeric or logical: returning NA 

警告重复8次,大概是一旦为每个呼叫到mean()。我猜这是因为试图采取一个因素的意思。我可以这样写:

ddply(df1, .(Aa, Bb), function(df1) mean(df1$x)) 

ddply(df1, .(Aa, Bb), summarize, x = mean(x)) 

两者做的工作(不给NAS),但我宁愿避免编写出18个这样的x = mean(x)报表,每一个我的数字的列。

是否有一个通用的解决方案?如果在其他地方有更好的答案,我不会接受ddply

回答

6

因为你是减少的行数兴田,你需要使用summarise

> ddply(df1, .(Aa, Bb), summarise, mean_x =mean(x)) 
    Aa Bb mean_x 
1 a b 0.3790675 
2 a B 0.4242922 
3 A b 0.5622329 
4 A B 0.4574471 

这只是容易在这种情况下使用聚合。比方说,你有两个变量:

> aggregate(df1[-(1:2)], df1[1:2], mean) 
    Aa Bb   x   y 
1 a b 0.4249121 0.4639192 
2 A b 0.6127175 0.4639192 
3 a B 0.4522292 0.4826715 
4 A B 0.5201965 0.4826715 
+2

作为聚合所有,但自变量,尝试:骨料(〜AA + BB,数据= DF1,平均) – kohske 2011-03-27 05:22:59

2

ddply支持负的索引,以及:

ddply(df1, .(Aa, Bb), function(x) mean(x[-(1:2)])) 
+1

这真的是“[”是处理这些指数。 – 2011-03-27 22:09:17

+0

@Dwin - 有效点。出于实际的目的,它是六合一,另一半是二打......还是我错过了别的东西?我想这依赖于知道列的索引,你不想返回提前的“均值”。 – Chase 2011-03-27 23:51:19

+0

如果你不想“知道”什么数字负面指定总是有的grep的()。像x [-grep(“Aa | Bb”,names(x))]应该起作用。 – 2011-04-24 16:30:50