【问题标题】:Aggregating big data in R在 R 中聚合大数据
【发布时间】:2014-11-07 20:05:52
【问题描述】:

我有一个如下所示的数据集 (dat):

Team    Person      Performance1    Performance2
 1      36465930         1              101
 1      37236856         1              101
 1      34940210         1              101
 1      29135524         1              101
 2      10318268         1              541
 2      641793           1              541
 2      32352593         1              541
 2      2139024          1              541
 3      35193922         2              790
 3      32645504         2              890
 3      32304024         2              790
 3      22696491         2              790

我正在尝试识别并删除所有在 Performance1 或 Performance2 上存在差异的团队。因此,例如,示例中的团队 3 在性能 2 上存在差异,因此我想从数据集中删除该团队。这是我写的代码:

tda <- aggregate(dat, by=list(data$Team), FUN=sd)
tda1 <- tda[ which(tda$Performance1 != 0 | tda$Performance2 != 0), ]

问题是我的数据集中有超过 100,000 个团队,所以我的第一行代码需要很长时间,而且我不确定它是否会完成数据集的聚合。解决此问题的更有效方法是什么?

提前致谢! :)

真诚地, 艾米

【问题讨论】:

  • 我认为像df[!aggregate(.~Team, df, sd)[4] &gt; 0, ] 这样的东西会快得多。

标签: r aggregate aggregation large-data bigdata


【解决方案1】:

data.table 用于大型数据集

library(data.table)
setDT(dat)[, setNames(lapply(.SD,sd), paste0("sdP", 1:2)),
                   .SDcols=3:4, by=Team][,.SD[!sdP1& !sdP2]]
#    Team sdP1 sdP2
#1:    1    0    0
#2:    2    0    0

如果您有更多的Performance 列,您可以使用dplyr 中的summarise_each

 datNew <- dat %>%
 group_by(Team) %>% 
 summarise_each(funs(sd), starts_with("Performance"))

 colnames(datNew)[-1] <- paste0("sdP", head(seq_along(datNew),-1))
 datNew[!rowSums(datNew[-1]),]

给出输出

 #    Team sdP1 sdP2
#1    1    0    0
#2    2    0    0

【讨论】:

    【解决方案2】:

    dplyr 包通常非常快。这是一种只选择Performance1Performance2 的标准差为零的团队的方法:

    library(dplyr)
    
    datAggregated = dat %>%
      group_by(Team) %>%
      summarise(sdP1 = sd(Performance1),
                sdP2 = sd(Performance2)) %>%
      filter(sdP1==0 & sdP2==0)
    
    datAggregated
      Team sdP1 sdP2
    1    1    0    0
    2    2    0    0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      • 2015-06-28
      • 2016-01-13
      相关资源
      最近更新 更多