gpt4 book ai didi

R data.table 值取决于前一行

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

我正在尝试解决提出的问题here .基本上我需要的是,对于 data.table 的每一行,获取前一行中每个变量的值,并使用它们来定义下一行中的变量值。

我尝试过使用 data.table,但结果非常庞大,而且我认为效率极低(尤其是对于大量行)。我还尝试使用 shift() 函数,但无法将其放入我的临时解决方案中。

这是一个玩具示例:

library(data.table)
DT = data.table(a = numeric(10L), b = numeric(10L), c = numeric(10L), iter = 1:10)

for(i in DT[,.I]){

DT[i, c('a','b','c') := {
if(iter == 1) {
a = 1
b = 2
c = 3
} else { # if it is not the first iteration
a = DT[i-1, a + b] # read the values from the previous row to compute the new values
b = DT[i-1, b] - a
c = a / b + DT[i-1, c]
}

.(a, b, c)
}]

}

这是输出:

     a  b          c iter
1: 1 2 3.0000000 1
2: 3 -1 0.0000000 2
3: 2 -3 -0.6666667 3
4: -1 -2 -0.1666667 4
5: -3 1 -3.1666667 5
6: -2 3 -3.8333333 6
7: 1 2 -3.3333333 7
8: 3 -1 -6.3333333 8
9: 2 -3 -7.0000000 9
10: -1 -2 -6.5000000 10

有人可以帮我改进代码吗?

最佳答案

注意:这不是对 OP 问题的一般性回答,只是对发布的玩具示例的回答。

您对 a 和 b 的迭代每六次迭代一次,c 是一个累加和。因此,它不必迭代计算,但对任何迭代都有一个封闭形式的解决方案#:

f = function(i, a0 = 1, b0 = 2, c0 = 2.5){
trio = c(a0, a0+b0, b0)
a = c(trio, -trio)
b = -c(tail(a, 1L), head(a, -1L))

cs = cumsum(a/b)
c6 = tail(cs, 1L)

k = (i - 1L) %/% 6L
ii = 1L + (i - 1L) %% 6L

list(a = a[ii], b = b[ii], c = c0 + k*c6 + cs[ii])
}

library(data.table)
DT = data.table(iter = 1:10)[, c("a", "b", "c") := f(iter)][]

iter a b c
1: 1 1 2 3.0000000
2: 2 3 -1 0.0000000
3: 3 2 -3 -0.6666667
4: 4 -1 -2 -0.1666667
5: 5 -3 1 -3.1666667
6: 6 -2 3 -3.8333333
7: 7 1 2 -3.3333333
8: 8 3 -1 -6.3333333
9: 9 2 -3 -7.0000000
10: 10 -1 -2 -6.5000000

也就是说,您可以直接跳到任何迭代:

> setDT(f(10))[]
a b c
1: -1 -2 -6.5
> setDT(f(100))[]
a b c
1: -1 -2 -101.5

关于R data.table 值取决于前一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342915/

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