行按变量 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:
答案 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")