在ID子集中执行数值运算,并将结果返回到同一数据帧中

时间:2013-05-09 16:27:39

标签: r for-loop apply

我有一个大型数据集,包括各种主题(ID)的纵向测量,有些变量可以说:

test.df <- data.frame(id=c(rep("A", 50),rep("B", 50)), x1=rnorm(100), x2=rnorm(100))

我想对每个ID的所有记录执行一些数值运算,并将结果返回到同一数据集中。

现在我正在做的是:

test.df <- data.frame(id=c(rep("A", 50),rep("B", 50)), x1=rnorm(50), x2=rnorm(50))

test.df$mean.of.x1<-NA
test.df$mean.of.x2<-NA

for(i in unique(test.df$id)){
  test.df$mean.of.x1[test.df$id==i]<-mean(test.df$x1[test.df$id==i])
  test.df$mean.of.x2[test.df$id==i]<-mean(test.df$x2[test.df$id==i])
}

这个例子非常简单(也许是愚蠢的),但它显示了我需要的东西(在我原来的问题中,每个ID都有几个函数不仅仅是mean)。有没有更有效的方法来做到这一点?任何*apply功能都可以帮助吗?

2 个答案:

答案 0 :(得分:2)

transform(test.df, mean.of.x1 = ave(x1, id, FUN=mean), 
                   mean.of.x2 = ave(x2, id, FUN=mean))

答案 1 :(得分:1)

聚合和合并的组合将起到作用。

results = aggregate(x=test.df, list(test.df$id), mean)
test.df.updated = merge(test.df, results, by.x = 1, by.y=1)