【问题标题】:R data.table: keep column when grouping by expressionR data.table:按表达式分组时保留列
【发布时间】:2020-03-03 18:26:53
【问题描述】:

当按涉及列的表达式(例如DT[...,.SD[c(1,.N)],by=expression(col)])进行分组时,我想将col 的值保留在.SD 中。

例如,在下面我将a 的余数除以 3 进行分组,并在每组中保留第一个和最后一个观察值。但是,a 不再存在于 .SD 中

f <- function(x) x %% 3

Q <- data.table(a = 1:20, x = rnorm(20), y = rnorm(20))
Q[, .SD[c(1., .N)], by = f(a)]

   f         x          y
1: 1 0.2597929  1.0256259
2: 1 2.1106619 -1.4375193
3: 2 1.2862501  0.7918292
4: 2 0.6600591 -0.5827745
5: 0 1.3758503  1.3122561
6: 0 2.6501140  1.9394756

想要的输出就好像我已经完成了以下操作

Q[, f := f(a)]
tmp <- Q[, .SD[c(1, .N)], by=f]
Q[, f := NULL]
tmp[, f := NULL]
tmp

    a         x          y
1:  1 0.2597929  1.0256259
2: 19 2.1106619 -1.4375193
3:  2 1.2862501  0.7918292
4: 20 0.6600591 -0.5827745
5:  3 1.3758503  1.3122561
6: 18 2.6501140  1.9394756

有没有办法直接做到这一点,而无需创建新变量并创建新的中间data.table?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    使用.I 代替.SD 来获取行索引,提取该列 ($V1) 并对原始数据集进行子集化

    library(data.table)
    Q[Q[, .I[c(1., .N)], by = f(a)]$V1]
    #    a          x          y
    #1:  1  0.7265238  0.5631753
    #2: 19  1.7110611 -0.3141118
    #3:  2  0.1643566 -0.4704501
    #4: 20  0.5182394 -0.1309016
    #5:  3 -0.6039137  0.1349981
    #6: 18  0.3094155 -1.1892190
    

    注意:“x”、“y”列中的值会有所不同,因为没有set.seed

    【讨论】:

    • 太棒了,这正是我要找的。​​span>
    • @IceCreamToucan 听说.SD 进行了优化,但.I 可能更快
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2015-08-04
    相关资源
    最近更新 更多