通过多个子组为每个组获取最小值

时间:2019-02-18 09:46:44

标签: r data.table grouping aggregate minimum

我正在使用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

1 个答案:

答案 0 :(得分:2)

使用的两种可能的方法:

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