在 r 中使用先前计算的行值
Use previous calculated row value in r
我有一个 data.table 看起来像这样:
DT <- data.table(A=1:20, B=1:20*10, C=1:20*100)
DT
A B C
1: 1 10 100
2: 2 20 200
3: 3 30 300
4: 4 40 400
5: 5 50 500
...
20: 20 200 2000
我希望能够计算一个新列"D",其第一个值为 B 列中前 20 行的平均值作为第一个值,然后我想使用第一行D 列的值,以帮助计算 D 的下一行值。
假设 B 列前 20 行的平均值为 105。D 列中下一行的公式为:DT$D[1]+DT$C[2]
我在其中获取 D 的前一行值并添加 C 的行值。
第三行将如下所示:DT$D[2]+DT$C[3]
A B C D
1: 1 10 100 105
2: 2 20 200 305
3: 3 30 300 605
4: 4 40 400 1005
5: 5 50 500 1505
...
20: 20 200 2000 21005
有什么想法吗?
我认为 shift 对滞后有很大帮助,但不知道如何摆脱它一开始产生的 NA?
我们可以取B列前20行的平均值加上C
的累加和。累积总和有一个特殊的考虑,我们要添加 0
和 C 列的串联,而不是第一个值。
DT[, D := mean(B[1:20]) + cumsum(c(0, C[-1]))][]
# A B C D
# 1: 1 10 100 105
# 2: 2 20 200 305
# 3: 3 30 300 605
# 4: 4 40 400 1005
# 5: 5 50 500 1505
# 6: 6 60 600 2105
# 7: 7 70 700 2805
# 8: 8 80 800 3605
# 9: 9 90 900 4505
# 10: 10 100 1000 5505
# 11: 11 110 1100 6605
# 12: 12 120 1200 7805
# 13: 13 130 1300 9105
# 14: 14 140 1400 10505
# 15: 15 150 1500 12005
# 16: 16 160 1600 13605
# 17: 17 170 1700 15305
# 18: 18 180 1800 17105
# 19: 19 190 1900 19005
# 20: 20 200 2000 21005
我有一个 data.table 看起来像这样:
DT <- data.table(A=1:20, B=1:20*10, C=1:20*100)
DT
A B C
1: 1 10 100
2: 2 20 200
3: 3 30 300
4: 4 40 400
5: 5 50 500
...
20: 20 200 2000
我希望能够计算一个新列"D",其第一个值为 B 列中前 20 行的平均值作为第一个值,然后我想使用第一行D 列的值,以帮助计算 D 的下一行值。
假设 B 列前 20 行的平均值为 105。D 列中下一行的公式为:DT$D[1]+DT$C[2] 我在其中获取 D 的前一行值并添加 C 的行值。 第三行将如下所示:DT$D[2]+DT$C[3]
A B C D
1: 1 10 100 105
2: 2 20 200 305
3: 3 30 300 605
4: 4 40 400 1005
5: 5 50 500 1505
...
20: 20 200 2000 21005
有什么想法吗?
我认为 shift 对滞后有很大帮助,但不知道如何摆脱它一开始产生的 NA?
我们可以取B列前20行的平均值加上C
的累加和。累积总和有一个特殊的考虑,我们要添加 0
和 C 列的串联,而不是第一个值。
DT[, D := mean(B[1:20]) + cumsum(c(0, C[-1]))][]
# A B C D
# 1: 1 10 100 105
# 2: 2 20 200 305
# 3: 3 30 300 605
# 4: 4 40 400 1005
# 5: 5 50 500 1505
# 6: 6 60 600 2105
# 7: 7 70 700 2805
# 8: 8 80 800 3605
# 9: 9 90 900 4505
# 10: 10 100 1000 5505
# 11: 11 110 1100 6605
# 12: 12 120 1200 7805
# 13: 13 130 1300 9105
# 14: 14 140 1400 10505
# 15: 15 150 1500 12005
# 16: 16 160 1600 13605
# 17: 17 170 1700 15305
# 18: 18 180 1800 17105
# 19: 19 190 1900 19005
# 20: 20 200 2000 21005