r - 找到所有重复项的平均值

标签 r dataframe duplicate-removal

有一个很好的解释here描述如何通过选取最大变量来消除数据框中的重复项。
我还可以看到如何应用它来选择具有最小变量的重复项。
我现在的问题是如何显示 平均值 所有重复?
例如:

z <- data.frame(id=c(1,1,2,2,3,4),var=c(2,4,1,3,5,2))
# id var
#  1   2
#  1   4
#  2   1
#  2   3
#  3   5
#  4   2

我想要输出:
# id var
#  1   3     mean(2,4)
#  2   2     mean(1,3)
#  3   5
#  4   2

我目前的代码是:
averages<-do.call(rbind,lapply(split(z,z$id),function(chunk) mean(chunk$var)))
z<-z[order(z$id),]
z<-z[!duplicated(z$id),]
z$var<-averages

我的代码运行速度非常慢,比选择最大值的方法需要大约 10 倍的时间。如何优化此代码?

最佳答案

这是使用 data.table 的更快解决方案

library(data.table)
z <- data.frame(id=sample(letters, 6e5, replace = TRUE),var = rnorm(6e5))

fn1 <- function(z){
  z$var <- ave(z$var, z$id, FUN=mean)
  return(unique(z))
}

fn2 <- function(z) {
  t(sapply(split(z,z$id), function(x) sapply(x,mean)))
}

fn3 <- function(z){
  data.table(z)[,list(var = mean(var)), 'id']
}

library(rbenchmark)
benchmark(f1 <- fn1(z), f2 <- fn2(z), f3 <- fn3(z), replications = 2)

  est replications elapsed         relative     user.self  sys.self 
1 f1 <- fn1(z)            2   3.619 8.455607     3.331    0.242          
2 f2 <- fn2(z)            2   0.586 1.369159     0.365    0.220          
3 f3 <- fn3(z)            2   0.428 1.000000     0.341    0.086   

关于r - 找到所有重复项的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881660/

相关文章:

r - 下载整个 CRAN 存储库需要多少空间?

r - 使用 dplyr 创建虚拟变量

r 在目录的文件名中搜索多个包含 '&' 的字符串

python - 如何连接 Pandas 中的两个数据框?

python - 使用 pandas/numpy 进行高效的 p​​ython 数据转换

r - `setattr` on `levels` 保留不需要的重复项(R data.table)

r - 使用 R 在关系表中进行数据屏蔽

python - 如何在 SMALLINT 上使用 teradatasql 在数据库中插入空值,计算期间发生数字溢出

solr - 搜索 Solr 索引时避免重复

regex - 如何从大量 URL 列表中删除重复域?正则表达式或其他