【问题标题】:Aggregate data.frame rows using data table with multiple collapse functions使用具有多个折叠函数的数据表聚合 data.frame 行
【发布时间】:2016-02-26 22:31:00
【问题描述】:

我有一个大的data.frame 这个示例结构:

df <- data.frame(id = rep(c("a","b","c"),4), sex = rep(c("M","F"),6), score = 1:12)

我想通过id 列有效地聚合它并用逗号分隔粘贴唯一的sex 值并保持最大score 值。

如何修改这个data.table 函数来实现:

setDT(df)[, lapply(.SD, function(x) paste(unique(x), collapse = ",")), by = list(id)]

【问题讨论】:

  • df[, .(unique_sex = toString(unique(sex)), score_max = max(score)), by = id]?
  • 为什么在这里使用 od .SD?在您的真实数据中,您还有其他列吗?
  • @user1701545,如果这回答了您的问题,请随时自行发布答案。 agstudy 的问题很有道理
  • agstudy,我正在使用 SD,因为我知道这比 dplyr 选项更有效。除此之外没有什么特别的原因。你有比 SD 更好的解决方案吗?
  • 为什么要以data.frame 开头?就做DT &lt;- data.table(...)

标签: r dataframe data.table aggregate


【解决方案1】:

您确定要使用strsplit 吗?将sex 值保留为list 怎么样?像这样:

df[ , .(list(sex), max(score)), by = id]
#    id      V1 V2
# 1:  a M,F,M,F 10
# 2:  b F,M,F,M 11
# 3:  c M,F,M,F 12

(我们当然可以随意命名列)

关于时间,这里是listdata.table 中的pastedplyr 中的paste,我们看到dplyr 在非平凡大小的数据集上占主导地位:

set.seed(102349)
NN <- 1e6
DT <- data.table(id = sample(c("a","b","c"), NN, TRUE),
                 sex = sample(c("M","F"), NN, TRUE),
                 score = sample(12, NN, TRUE))

library(microbenchmark)

microbenchmark(times = 1000L,
               mikec = DT[ , .(list(unique(sex)), max(score)), by = id],
               mikec_str = DT[ , .(paste(unique(sex), collapse = ","),
                                   score = max(score)), by = id],
               count = DT %>% group_by(id) %>% 
                 summarise(score = max(score), 
                           sex = paste(unique(sex),collapse=",")))
# Unit: milliseconds
#       expr      min       lq     mean   median       uq      max neval cld
#      mikec 20.31309 20.73779 30.47556 21.95649 35.02822 241.6299  1000  a 
#  mikec_str 20.34941 20.76544 32.05443 22.40155 35.32093 325.3754  1000  a 
#      count 27.20780 29.11735 47.38582 42.93207 44.54086 334.8008  1000   b

【讨论】:

    【解决方案2】:

    你可以试试:

    require(dplyr)
    df %>% group_by(id) %>% summarise(score = max(score), sex = paste(unique(sex),collapse=","))
    

    【讨论】:

    • 我会,但 data.table 选项要快得多,这对我来说至关重要。
    • 您确定data.table 解决方案更快吗?鉴于您的示例,dplyr 解决方案在我的机器上的速度提高了 10 倍。
    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2014-09-07
    • 2012-07-05
    • 1970-01-01
    • 2016-05-02
    相关资源
    最近更新 更多