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