gpt4 book ai didi

R:数据表中的行条件总和

转载 作者:行者123 更新时间:2023-12-04 07:25:06 25 4
gpt4 key购买 nike

我有一个非常大的数据集(数百万行,我需要循环数千次),并且在循环期间我必须做一个似乎需要很长时间的条件求和。有没有办法使这更有效?
数据表格式如下:

DT <- data.table('A' = c(1,1,1,2,2,3,3,3,3,4),
'B' = c(500,510,540,500,540,500,510,519,540,500),
'C' = c(10,20,10,20,10,50,20,50,20,10))


一种

C


1
500
10

1
510
20

1
540
10

2
500
20

2
540
10

3
500
50

3
510
20

3
519
50

3
540
20

4
500
10


我需要 C 列的总和(在新列 D 中)受 A == A 约束,并且 B >= B & B < B + 20(按行)。因此,输出表将如下所示:


一种

C
D


1
500
10
30

1
510
20
30

1
540
10
10

2
500
20
20

2
540
10
10

3
500
50
120

3
510
20
120

3
519
50
120

3
540
20
20

4
500
10
10


我目前使用的代码:
DT[,D:= sum(DT$C[A == DT$A & ((B >= DT$B) & (B < DT$B + 20))]), by=c('A', 'B')]
这需要很长时间才能实际运行,并给我错误的答案。我得到的输出如下所示:


一种

C
D


1
500
10
10

1
510
20
30

1
540
10
10

2
500
20
20

2
540
10
10

3
500
50
50

3
510
20
70

3
519
50
120

3
540
20
20

4
500
10
10


(即 D 似乎只会累积增加)。
我不太关心累积的事情,更多的是关于速度。最终我想要得到的是 C 的最大总和,由 A 计算,但 B 必须在彼此的 20 以内。我真的很感激这方面的任何帮助!提前致谢。

最佳答案

如果我理解正确,这可以通过非等自连接来解决:

DT[, Bp20 := B + 20][
DT, on = .(A, B >= B, B < Bp20), mult = "last"][
, .(B, C = i.C, D = sum(i.C)), by = .(A, Bp20)][
, Bp20 := NULL][]
    A   B  C   D
1: 1 500 10 30
2: 1 510 20 30
3: 1 540 10 10
4: 2 500 20 20
5: 2 540 10 10
6: 3 500 50 120
7: 3 510 20 120
8: 3 519 50 120
9: 3 540 20 20
10: 4 500 10 10

关于R:数据表中的行条件总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68258382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com