r - 对于除当前级别之外的所有级别的每个级别的因子聚合值

标签 r aggregate data.table plyr

对于每个级别的因素,我需要提取除当前子集之外的所有 data.frame 子集的聚合值。例如,有几个主题在几天内执行 react 时间任务,我需要计算所有主题和所有天的平均 react 时间,但不包括计算平均值的主题。目前,我是这样做的:

 library(lme4)
 ddply(sleepstudy, .(Subject, Days), summarise, 
       avg_rt = mean(sleepstudy[sleepstudy$Subject != Subject &
                   sleepstudy$Days == Days,"Reaction"]), .progress="text")

它适用于小型数据集,但对于大型数据集可能会非常慢。有没有更快的方法?

最佳答案

#create big dataset
n <- 1e4
set.seed(1)
sleepstudy <- data.frame(Reaction=rnorm(n),Subject=1:4,Days=sort(rep((1:(n/4)),4)))


library(plyr)
system.time(
  res <- ddply(sleepstudy, .(Subject, Days), summarise, 
               avg_rt = mean(sleepstudy[sleepstudy$Subject != Subject &
                 sleepstudy$Days == Days,"Reaction"]))
)
#User      System      elapsed 
#6.532       0.013       6.556  

#use data.table for big datasets
library(data.table)

dt<- as.data.table(sleepstudy)
system.time(
 {dt[,avg_rt:=mean(Reaction),by=Days];
  dt[,n:=.N,by=Days];
  dt[,avg_rt:=(avg_rt*n-Reaction)/(n-1)]}
)
#User      System      elapsed 
#0.005       0.001       0.005 


#test if results are equal
dt2 <- as.data.table(res)
setkey(dt2,Subject,Days)
setkey(dt,Subject,Days)
all.equal(dt[,avg_rt],dt2[,avg_rt])
#[1] TRUE

对于非常大的数据集,速度增益应该更加明显。我无法与更大的数据集进行比较,因为 ddply 太慢了。

关于r - 对于除当前级别之外的所有级别的每个级别的因子聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12660211/

相关文章:

使用 mtext 删除添加到绘图中的文本

r - 自动对 tbl_uvregression (gtsummary) 中的许多结果进行单变量回归,在 R 中返回格式化结果

r - 聚合值和缺失值

ruby-on-rails - Rails ORM 是否限制执行聚合的能力?

r - 来自 data.table::frollmean() 的意外高内存使用

r - 使用 .I 获取错误 : Could not find function "." for only one data. 表

css - 将背景图像添加到 Shiny NavBarPage

r - R中动物园对象的分位数和聚合

r - 计算多列上的多个 Pareto 图

R data.table - 使用.SD时如何通过引用进行修改?