【问题标题】:Use previous calculated row value in r在 r 中使用先前计算的行值
【发布时间】:2015-10-28 12:55:15
【问题描述】:

我有一个如下所示的 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?

【问题讨论】:

  • 试试library(RcppRoll); DT[, D:= cumsum(roll_mean(B, 20))] 示例数据没有20行,所以这里没有测试。
  • 你是只取前 20 行的平均值而不是扩展它吗?
  • 我不认为他们在扩大平均值。求均值一次,在后面添加 C 列
  • @PierreLafortune 没有可重现的例子,我不知道。
  • 我已将示例更新为包含 20 行,希望对您有所帮助

标签: r data.table lag shift


【解决方案1】:

我们可以取 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

【讨论】:

  • 这太好了,谢谢!如果我想将它与一个数字相乘而不是添加 C,会发生什么?
  • 感谢@DavidArenburg。 shift 的使用很好,但我在新列中没有得到相同的总和
  • @KhalidN 你有像C 这样的数字列还是单个值?
  • 好吧,最后一次尝试,DT[, D := mean(B[1:20]) + cumsum(c(0L, shift(C, 1L, type = "lead")[-.N]))] 如果我们能做到C[-1] 的话,这有点傻 :))
  • @PierreLafortune 它是一个值,而不是一列数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2017-04-30
  • 1970-01-01
  • 2013-01-19
  • 2018-09-30
  • 1970-01-01
相关资源
最近更新 更多