gpt4 book ai didi

r - 使用上一行更新列值

转载 作者:行者123 更新时间:2023-12-02 00:55:11 25 4
gpt4 key购买 nike

我想使用 data.table 函数通过引用前几行中的值来更新列的值。这是一个例子

> DT<-data.table(id=1:2,x=1:10,y=1)

我已经知道 data.table 可以像下面这样引用前面的行:

> DT[,z:=cumsum(y),keyby=id]
> DT[]
id x y z
1: 1 1 1 1
2: 1 3 1 2
3: 1 5 1 3
4: 1 7 1 4
5: 1 9 1 5
6: 2 2 1 1
7: 2 4 1 2
8: 2 6 1 3
9: 2 8 1 4
10: 2 10 1 5

但是,下一个示例不起作用,它尝试使用 y 列中的先前值创建一个 Fibonacci 系列来更新自身。似乎 data.table 没有使用循环来迭代执行计算。谁能告诉我如何优雅地使用 data.table 解决此类问题?

> DT[,y:=shift(y,1,fill=0)+shift(y,2,fill=0),]
> DT[]
id x y z
1: 1 1 0 1
2: 1 3 1 2
3: 1 5 2 3
4: 1 7 2 4
5: 1 9 2 5
6: 2 2 0 1
7: 2 4 1 2
8: 2 6 2 3
9: 2 8 2 4
10: 2 10 2 5

下面是我真正想要的(y 列已更新):

    id  x y z
1: 1 1 1 1
2: 1 3 1 2
3: 1 5 2 3
4: 1 7 3 4
5: 1 9 5 5
6: 2 2 1 1
7: 2 4 1 2
8: 2 6 2 3
9: 2 8 3 4
10: 2 10 5 5

最佳答案

根据定义,生成斐波那契数列是一个顺序问题,我们可以在 data.table 中通过定义一个在底层使用 for.loop 的自定义函数来解决这个问题.

# Define function
fibon <- function(x) {
for(i in 3:length(x)) x[i] = x[i-1] + x[i-2]
return(x)
}

# Plug into data.table
DT[,y := fibon(y), by = id]
> DT
# id x y z
#1: 1 1 1 1
#2: 1 3 1 2
#3: 1 5 2 3
#4: 1 7 3 4
#5: 1 9 5 5
#6: 2 2 1 1
#7: 2 4 1 2
#8: 2 6 2 3
#9: 2 8 3 4
#10: 2 10 5 5

关于r - 使用上一行更新列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36212717/

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