【问题标题】:Perform numerical operation in subset of IDs and return the results in the same data frame在 ID 子集中执行数值运算,并在同一数据框中返回结果
【发布时间】:2013-05-09 16:27:39
【问题描述】:

我有一个大型数据集,其中包含各种主题 (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 函数可以帮忙吗?

【问题讨论】:

  • 您的意思是创建一个示例测试,例如:test.df
  • 是的。感谢那。我更正了问题

标签: r for-loop apply


【解决方案1】:
transform(test.df, mean.of.x1 = ave(x1, id, FUN=mean), 
                   mean.of.x2 = ave(x2, id, FUN=mean))

【讨论】:

  • 多么漂亮的一个班轮。谢谢你!
【解决方案2】:

聚合和合并的组合可以解决问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多