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

R 通过多个子组获取每个组的最小值,r,data.table,grouping,aggregate,minimum,R,Data.table,Grouping,Aggregate,Minimum,我使用的是R,有一个如下所示的数据表。var1和var2的值与每行的上下文相关(按var1升序),而var3是各组var3的累积总数(按g1,g2,g3)var4是一个分为十分之一堆叠的变量(数据中每组有10行) 问题 编辑:对于var4的每个值,我需要从所有var3的最小值计算var1的最小值,即>=每个var4 我有数百万行这种类型的数据,所以性能很重要 任何帮助都将不胜感激 旧问题:对于每一行:如果组的var4是所有var3中的最小值,则使用最大var3行中的最小值var1,即两种可能的方

我使用的是R,有一个如下所示的数据表。var1var2的值与每行的上下文相关(按var1升序),而var3是各组var3的累积总数(按g1g2g3var4是一个分为十分之一堆叠的变量(数据中每组有10行)

问题

编辑:对于var4的每个值,我需要从所有var3的最小值计算var1的最小值,即>=每个var4

我有数百万行这种类型的数据,所以性能很重要

任何帮助都将不胜感激


旧问题:对于每一行:如果组的var4<最小值var3,则应返回所有var1的最小值。如果var4>是所有var3中的最小值,则使用最大var3行中的最小值var1,即两种可能的方法:


使用数据:

DT <- fread("g1   g2     g3  var1  var2  var3  var4  var5
A        01/01/2019...  -30      50    1000  1000   200  50
A        01/01/2019...  -30      55       0  1000   400  50
A        01/01/2019...  -30      57       0  1000   600  50
A        01/01/2019...  -30      59     100  1100   800  50
A        01/01/2019...  -30      70       0  1100  1000  50
A        01/01/2019...  -30      77       0  1100  1200  59
A        01/01/2019...  -30      91     200  1300  1400  91
A        01/01/2019...  -30      93     250  1550  1600  93
A        01/01/2019...  -30      95       0  1550  1800  93
A        01/01/2019...  -30      99     450  2000  2000  99")[, var5 := NULL]

DT请创建一个最小的可复制示例。OP已经提供了一个示例,并告诉我们它的预期输出。您好,您的专栏,g2被截断了。您是否介意填写详细信息,以便明确分组?此分组中所有行的示例日期时间为2019年1月1日04:30:00。一旦我能够更新问题和示例代码以重新澄清问题,我将立即更新代码。如果对于var4的每个值,我需要从所有var3的最小值中计算var1的最小值,即>=每个var4?我已编辑示例代码以显示预期结果,但无法修改您的代码以达到此解决方案。
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
# 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
DT <- fread("g1   g2     g3  var1  var2  var3  var4  var5
A        01/01/2019...  -30      50    1000  1000   200  50
A        01/01/2019...  -30      55       0  1000   400  50
A        01/01/2019...  -30      57       0  1000   600  50
A        01/01/2019...  -30      59     100  1100   800  50
A        01/01/2019...  -30      70       0  1100  1000  50
A        01/01/2019...  -30      77       0  1100  1200  59
A        01/01/2019...  -30      91     200  1300  1400  91
A        01/01/2019...  -30      93     250  1550  1600  93
A        01/01/2019...  -30      95       0  1550  1800  93
A        01/01/2019...  -30      99     450  2000  2000  99")[, var5 := NULL]