【问题标题】:R: how to "coalesce ()" a whole data tableR:如何“合并()”整个数据表
【发布时间】:2019-02-23 23:12:28
【问题描述】:

参考问题:R: stacking up values from rows of a data frame

嗨,

我有一个大型 data.table(100 万行)。每行包含 30 个值,前四个标识一个对象。许多行可能具有相同的前四个字段,这意味着它们被引用到同一个对象。其余 26 个字段可能是数字或“NA”。

关键是引用同一对象的许多行(或者,具有相同的前四个字段)将具有不同定义的其余 26 个字段,并且通常包含大量 NA 和只有少数数值。

我想将单个对象的所有多个引用(行)合并到一个行中,就像 dplyr::coalesce (x,y) 会超过 2 个向量一样。我试图将所有子集识别到表中,并使用一些循环逐行合并它们,但它非常慢。是否有更快的替代方案可以有效地处理大型数据表(约 100 万行,每行 30 个字段)?

非常感谢。

【问题讨论】:

    标签: r dataframe datatable dplyr


    【解决方案1】:

    当您对同一组有多个有效答案时,您想做什么?您需要某种聚合机制,即最小/最大/平均/等。这是一种利用data.table 中的by.SD 运算符的解决方案。在我的示例中,我将x1x2x3 中的max 取自id。这会将每个id 的三行合并为一行。

    library(data.table)
    dt <- data.table(id = rep(1:4, each = 3), x1 = c(1,NA,2,NA,3,NA,4,NA,5,NA,6,NA), x2 = c(NA,6,NA,5,NA,4,NA,3,NA,2,NA,NA), x3 = c(12,NA,NA,11, NA, NA, 10, NA,NA,NA, NA, NA))
    dt[, lapply(.SD, max, na.rm = TRUE),keyby = id]
    #> Warning in gmax(x3, na.rm = TRUE): No non-missing values found in at least
    #> one group. Returning '-Inf' for such groups to be consistent with base
    #>    id x1 x2   x3
    #> 1:  1  2  6   12
    #> 2:  2  3  5   11
    #> 3:  3  5  3   10
    #> 4:  4  6  2 -Inf
    

    reprex package (v0.2.1) 于 2019 年 2 月 23 日创建

    注意警告:-Inf,您可以在事后轻松清理。

    【讨论】:

      【解决方案2】:

      我不是百分百确定我已经理解了您的预期输出,但您可以将任意数量的向量传递给 coalesce(),这将导致 first 的单个向量不丢失值从左到右。它在大型数据帧上也很快。

      v <- c(1:10, rep(NA, 3))
      set.seed(5)
      df <- data.frame(replicate(30, sample(v, 1e6, replace = TRUE)))
      
      system.time(coalesce(!!!df))
      
      user  system elapsed 
      0.07    0.08    0.16 
      

      【讨论】:

      • 嗨@H1,实际上我的 data.table 的前两列是因子,所以 coalesce() 不起作用。
      猜你喜欢
      • 2016-03-21
      • 2021-04-12
      • 2018-05-20
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 2020-10-16
      • 1970-01-01
      相关资源
      最近更新 更多