3

我正在尝试获取数据框中每个子集的平均值,并将该信息合并到一列中。

我可以用 lapply 做到这一点,但我不能让它“坚持”。是否存在具有副作用的 apply 系列函数的变体?plyr 库中的任何内容都可以。

data <- data.frame(
  A = sample(LETTERS[1:3], 20, replace=TRUE),
  B = runif(20),
  C = LETTERS[1:20])
# split by A
dataByA <- split(data, factor(data$A))
# get average of B per set
lapply(dataByA, function(df) {df$Bmean <- mean(df$B)}) # does nothing!
# remerge subsets
data <- rbind.fill(dataByA)

谢谢

4

4 回答 4

8

试试这个:

data$Bmean <- ave(data$B, data$A)
于 2013-04-06T00:57:07.630 回答
5

这种事情有很多选择,但为了纠正你的直接错误,你的匿名函数lapply根本没有返回任何东西。只需让它返回它正在操作的部分:

{df$Bmean <- mean(df$B); df} 

我将把它留给大众来向您展示您使用by, ddply+mutatetransformand的选择data.table

于 2013-04-06T00:36:53.980 回答
3

这可能有效:

library(plyr)
data1<-ddply(data,.(A),transform,Bmean=mean(B))


head(data1)
 A           B C    Bmean
1  A 0.616156407 E 0.5492000
2  A 0.568187293 G 0.5492000
3  A 0.899395311 H 0.5492000
4  A 0.113060973 K 0.5492000
5  B 0.872838203 A 0.7885643
6  B 0.906216467 B 0.7885643
7  B 0.944196701 N 0.7885643
8  B 0.445983319 O 0.7885643
9  B 0.773586589 T 0.7885643
于 2013-04-06T00:41:11.667 回答
2

根据@joran,我将成为大众中的一员;) data.table 中的解决方案如下

DT[ , Bmean := mean(B), by=A]

DT简单的在哪里

library(data.table)
DT <- data.table( <your data frame> )
于 2013-04-06T06:19:21.107 回答