行按变量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)
最佳答案
您可以先按组查找最小值,然后使用滚动连接查找最接近的最小值:
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")
关于返回分组数据子组的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54757337/