gpt4 book ai didi

r - 满足条件时将 data.table 列值向前推进

转载 作者:行者123 更新时间:2023-12-04 10:52:48 26 4
gpt4 key购买 nike

我有一个包含两列的 data.table。

dt = data.table(a = c(0,0,-1,rep(0,3),-1,1), b = c(1,2,3,2,4,2,4,5))
> dt
a b
1: 0 1
2: 0 2
3: -1 3
4: 0 2
5: 0 4
6: 0 2
7: -1 4
8: 1 5

我需要发生的是任何时候列 a == -1 我需要将列 b 中的值结转到下一行之前的位置,其中列 a == -1。如果没有更多的 -1s 那么 b 列中的值需要继续直到 data.table 结束

这是我希望的结果
    a b
1: 0 1
2: 0 2
3: -1 3
4: 0 3
5: 0 3
6: 0 3
7: -1 4
8: 1 4

最佳答案

好吧,这并没有我原先想象的那么难。如有必要,我可以删除这个问题,但我在 stackoverflow 上没有找到类似的内容,所以我现在只发布我的解决方案。

第一个解决方案有问题。这实际上符合我的预期,但我确信有一种更快的方法来计算它。

library(data.table)
dt = data.table(a = c(0,0,-1,rep(0,3),-1,1), b = c(1,2,3,2,4,2,4,5))

indices = which(dt$a == -1)
values = dt$b[indices]

dt[ , "tmp" := findInterval(1:nrow(dt), indices)]

dt$b = mapply(function(tmp, b){
if(tmp == 0){
return(b)
}else{
return(values[tmp])
}
}, dt$tmp, dt$b)

dt[ , "tmp" := NULL]

> dt
a b
1: 0 1
2: 0 2
3: -1 3
4: 0 3
5: 0 3
6: 0 3
7: -1 4
8: 1 4

感谢@Frank 更好的解决方案
dt[, tmp := cumsum(a==-1)][tmp > 0L, b := first(b), by=tmp][, tmp := NULL ]

关于r - 满足条件时将 data.table 列值向前推进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43460019/

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