我正在使用R,并且具有如下所示的数据表。 var1 和 var2 的值与每行上下文相关(按 var1 升序排列),而 var3 每个组的总计 var3 (由 g1 , g2 , g3 )。 var4 是一个分解为十分之一的变量(数据中每个组有10行)。
问题
编辑:对于var4的每个值,我需要从所有 var3 的最小值中计算出 var1 的最小值,即> =每个 var4 ?
我有数百万行此类数据,因此性能很重要
任何帮助将不胜感激
旧问题:对于每一行:如果该组的 var4 <所有 var3 的最小值,则应返回所有 var1 的最小值。如果 var4 >所有 var 3 中的最小值,则在具有最大 var3 的行中的最小 var1 是<= var4 。
g1(char) g2(POSIXct) g3(int) var1(num) var2(num) var3(num) var4(num)
A 01/01/2019 04:30:00 -30 -100 1661 1661 280
A 01/01/2019 04:30:00 -30 0 0 1661 560
A 01/01/2019 04:30:00 -30 57 720 2381 840
A 01/01/2019 04:30:00 -30 59 0 2381 1120
A 01/01/2019 04:30:00 -30 70 0 2381 1400
A 01/01/2019 04:30:00 -30 77 0 2381 1680
A 01/01/2019 04:30:00 -30 91 80 2461 1960
A 01/01/2019 04:30:00 -30 93 0 2461 2240
A 01/01/2019 04:30:00 -30 95 0 2461 2520
A 01/01/2019 04:30:00 -30 99 340 2801 2800
一组的预期结果如下:
g1(char) g2(POSIXct) g3(int) var1 var2 var3 var4 var5
A 01/01/2019 04:30:00 -30 -100 1661 1661 280 -100
A 01/01/2019 04:30:00 -30 0 0 1661 560 -100
A 01/01/2019 04:30:00 -30 57 720 2381 840 -100
A 01/01/2019 04:30:00 -30 59 0 2381 1120 -100
A 01/01/2019 04:30:00 -30 70 0 2381 1400 -100
A 01/01/2019 04:30:00 -30 77 0 2381 1680 57
A 01/01/2019 04:30:00 -30 91 80 2461 1960 57
A 01/01/2019 04:30:00 -30 93 0 2461 2240 57
A 01/01/2019 04:30:00 -30 95 0 2461 2520 99
A 01/01/2019 04:30:00 -30 99 340 2801 2800 99
答案 0 :(得分:2)
使用data.table的两种可能的方法:
stores
两者都给出:
# option 1 DT[, var5 := min(var1) * (var4 <= min(var3)), by = .(g1, g2, g3) ][, var5 := replace(var5, var5 == 0, min(var1)), by = .(g1, g2, g3, var3)][] # option 2 DT[, var5 := min(var1) * (var4 <= min(var3)), by = .(g1, g2, g3) ][, var1min := min(var1), by = .(g1, g2, g3, var3) ][var5 == 0, var5 := var1min, by = .(g1, g2, g3, var3) ][, var1min := NULL][]
使用的数据:
> DT
g1 g2 g3 var1 var2 var3 var4 var5
1: A 01/01/2019... -30 50 1000 1000 200 50
2: A 01/01/2019... -30 55 0 1000 400 50
3: A 01/01/2019... -30 57 0 1000 600 50
4: A 01/01/2019... -30 59 100 1100 800 50
5: A 01/01/2019... -30 70 0 1100 1000 50
6: A 01/01/2019... -30 77 0 1100 1200 59
7: A 01/01/2019... -30 91 200 1300 1400 91
8: A 01/01/2019... -30 93 250 1550 1600 93
9: A 01/01/2019... -30 95 0 1550 1800 93
10: A 01/01/2019... -30 99 450 2000 2000 99