返回分组数据子组的最小值

标签 r data.table grouping

行按变量grp1、grp2、grp3分组。 对于下表中的每个 varD 值,我需要从以下 VarC 的所有值的最小值中返回 varA 的最小值>= varD?返回值存储在varX

列中

在给定行上,特定的 varCvarD 不是对。相反,在计算大于 varD 的最小 varC 时,需要将 varD 与所有 varC 进行比较。

varAvarBvarC 值成对出现,其中 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/

相关文章:

c# - 使用 LINQ 根据条件将集合拆分为多个部分?

mvvm - 如何使用 Collection View MVVM 进行分组?

python - Pandas 按时间分组,指定开始时间非整数分钟

roxygen2 不创建 .Rd 文档

R - 从调用对象获取形式

r - 是否存在等效于子集运算符 `[ ]` 的 R 函数,以便按行索引进行切片?

r - 解压并重新排列数据

r - 在 WSL 上安装 R devtools 包

删除 data.table 中的最后一个 NA 值

R:在可行的情况下进行快速(有条件)子集化