返回分组数据子组的最小值

时间:2019-02-19 00:38:59

标签: r data.table grouping

行按变量 grp1,grp2,grp3 分组。 对于下表中的每个 varD 值,我需要从 VarC 的所有值的最小值中返回 varA 的最小值> = varD ?返回的值存储在 varX

列中

在给定的行上,特定的 varC varD 不是对。在计算大于 varD 的最小 varC 时,需要将 varD 与所有 varC 进行比较。

varA varB varC 值是成对的,其中 varC varB

grp1   grp2(POSIXct)        grp3  varA  varB  varC  varD  
A      02/02/2019 05:30:00  -30   -100  1661  1661   280
A      02/02/2019 05:30:00  -30      0     0  1661   560
A      02/02/2019 05:30:00  -30     57   720  2381   840
A      02/02/2019 05:30:00  -30     59     0  2381  1120
A      02/02/2019 05:30:00  -30     70     0  2381  1400
A      02/02/2019 05:30:00  -30     77     0  2381  1680
A      02/02/2019 05:30:00  -30     91    80  2461  1960
A      02/02/2019 05:30:00  -30     93     0  2461  2240
A      02/02/2019 05:30:00  -30     95     0  2461  2520
A      02/02/2019 05:30:00  -30     99   340  2801  2800

一个小组的预期结果应该是:

grp1   grp2(POSIXct)        grp3  varA  varB  varC  varD  varX
A      02/02/2019 05:30:00  -30   -100  1661  1661   280  -100
A      02/02/2019 05:30:00  -30      0     0  1661   560  -100
A      02/02/2019 05:30:00  -30     57   720  2381   840  -100  
A      02/02/2019 05:30:00  -30     59     0  2381  1120  -100
A      02/02/2019 05:30:00  -30     70     0  2381  1400  -100
A      02/02/2019 05:30:00  -30     77     0  2381  1680    57
A      02/02/2019 05:30:00  -30     91    80  2461  1960    57
A      02/02/2019 05:30:00  -30     93     0  2461  2240    57
A      02/02/2019 05:30:00  -30     95     0  2461  2520    99
A      02/02/2019 05:30:00  -30     99   340  2801  2800    99

对于varD:

  • 1661是最小 varC > = 280-1400,因此 varX 是-100(最小 varA ,其中 varC == 1661)
  • 2381是最小 varC > = 1680-2240,因此 varX 是57(最小 varA ,其中 varC == 2381)
  • 2801是最小 varC > = 2520-2800,因此 varX 是99(最小 varA ,其中 varC == 2801)

1 个答案:

答案 0 :(得分:2)

您可以先按组查找分钟,然后使用滚动联接查找最接近的分钟:

agg <- DT[, min(varA), by=.(grp1, grp2, grp3, varC)]

DT[, newvar :=
    agg[DT, on=c("grp1", "grp2", "grp3", varC="varD"), roll=-Inf]$V1
]

输出:

    grp1                grp2 grp3 varA varB varC varD newvar
 1:    A 02/02/2019T05:30:00  -30 -100 1661 1661  280   -100
 2:    A 02/02/2019T05:30:00  -30    0    0 1661  560   -100
 3:    A 02/02/2019T05:30:00  -30   57  720 2381  840   -100
 4:    A 02/02/2019T05:30:00  -30   59    0 2381 1120   -100
 5:    A 02/02/2019T05:30:00  -30   70    0 2381 1400   -100
 6:    A 02/02/2019T05:30:00  -30   77    0 2381 1680     57
 7:    A 02/02/2019T05:30:00  -30   91   80 2461 1960     57
 8:    A 02/02/2019T05:30:00  -30   93    0 2461 2240     57
 9:    A 02/02/2019T05:30:00  -30   95    0 2461 2520     99
10:    A 02/02/2019T05:30:00  -30   99  340 2801 2800     99

数据:

library(data.table)
DT <- fread("grp1   grp2        grp3  varA  varB  varC  varD  
A      02/02/2019T05:30:00  -30   -100  1661  1661   280
A      02/02/2019T05:30:00  -30      0     0  1661   560
A      02/02/2019T05:30:00  -30     57   720  2381   840
A      02/02/2019T05:30:00  -30     59     0  2381  1120
A      02/02/2019T05:30:00  -30     70     0  2381  1400
A      02/02/2019T05:30:00  -30     77     0  2381  1680
A      02/02/2019T05:30:00  -30     91    80  2461  1960
A      02/02/2019T05:30:00  -30     93     0  2461  2240
A      02/02/2019T05:30:00  -30     95     0  2461  2520
A      02/02/2019T05:30:00  -30     99   340  2801  2800")