【问题标题】:data.table: (Quickly) set column values within a group to the group's last elementdata.table:(快速)将组内的列值设置为组的最后一个元素
【发布时间】:2020-08-19 00:37:29
【问题描述】:

假设我有一个像这样的数据集:

 example <- data.table(Object = rep(LETTERS[1:3], each=3), date = as.Date(rep(c(NA,NA,"2020-01-01"),3)), date_data =1:9)

example
   Object       date date_data
1:      A       <NA>         1
2:      A       <NA>         2
3:      A 2020-01-01         3
4:      B       <NA>         4
5:      B       <NA>         5
6:      B 2020-01-01         6
7:      C       <NA>         7
8:      C       <NA>         8
9:      C 2020-01-01         9

我想将某个组内的所有 date_data 设置为该组的最后一个 date_data 值。所以,想要的输出是这样的:

   Object       date date_data
1:      A       <NA>         3
2:      A       <NA>         3
3:      A 2020-01-01         3
4:      B       <NA>         6
5:      B       <NA>         6
6:      B 2020-01-01         6
7:      C       <NA>         9
8:      C       <NA>         9
9:      C 2020-01-01         9

现在,我已经成功地使用example[, date_data:= .SD[.N]$date_data, by = "Object"] 获得了我需要的东西。问题是我想在循环遍历大型数据表时进行这样的调用。 每次调用 .SD 太慢了。理想情况下,代码将使用 .I(如 here)或其他一些我不知道的 data.table 优化功能。我没有找到正确的方法来做到这一点。

有什么想法吗?

【问题讨论】:

    标签: r performance data.table grouping


    【解决方案1】:

    你可以使用data.table::last:

    library(data.table)
    
    example <- data.table(
      Object = rep(LETTERS[1:3], each=3),
      date = as.Date(rep(c(NA,NA,"2020-01-01"),3)), 
      date_data =1:9
    )
    example[, date_data := last(date_data), by =  Object ]
    example
    #    Object       date date_data
    #    <char>     <Date>     <int>
    # 1:      A       <NA>         3
    # 2:      A       <NA>         3
    # 3:      A 2020-01-01         3
    # 4:      B       <NA>         6
    # 5:      B       <NA>         6
    # 6:      B 2020-01-01         6
    # 7:      C       <NA>         9
    # 8:      C       <NA>         9
    # 9:      C 2020-01-01         9
    

    但我不知道有没有优化,否则你可以在变量上使用.N:

    example[, date_data := date_data[.N], by =  Object]
    example
    

    【讨论】:

    • 非常感谢,这太简单了,我都不好意思问了!绝对比 .SD 快得多(实际上是更明显的解决方案)。有时候休息一下也不错……
    • data.table 非常强大,实现同一个目标总是有不同的方法,很难想到所有的可能性:)
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 2020-04-09
    • 2017-02-27
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多