【问题标题】:Get minimum value for each group by multiple subgroups通过多个子组获取每个组的最小值
【发布时间】:2019-07-11 15:59:06
【问题描述】:

我正在使用 R 并且有一个如下所示的数据表。每行的 var1var2 的值是上下文相关的(按 var1 升序排列),而 var3 是每组 var3 的累计总数(按 g1g2g3)。 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

【问题讨论】:

  • 请创建一个可重现的最小示例。
  • OP已经提供了一个例子,也告诉我们它的预期输出。
  • 在您的专栏中,g2 被截断。您介意填写详细信息以便明确分组吗?
  • 此组中所有行的示例日期时间为 01/01/2019 04:30:00。我会尽快更新代码
  • 我已更新问题和示例代码以重新澄清问题

标签: r data.table grouping aggregate minimum


【解决方案1】:

使用 的两种可能方法:

# 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]

【讨论】:

  • 如果对于 var4 的每个值,我需要从所有 var3 的最小值(即 >= 每个 var4)中计算 var1 的最小值,该怎么办?我已编辑示例代码以显示预期结果,但我无法修改您的代码以达到此解决方案。
猜你喜欢
  • 2010-09-16
  • 2022-07-05
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多