data.table 行值取决于 R 中的先前值
data.table row value depend on previous value in R
我有一个 data.table x
,它有 2 列 a
,b
。
我想计算一个 c
列。
library(data.table)
x = data.table(a = c(1:5), b = c(1,0,2,3,6), c = NA)
x$a[1] = NA
x$b[1] = NA
x
#> a b c
#> <int> <num> <lgcl>
#> 1: NA NA NA
#> 2: 2 0 NA
#> 3: 3 2 NA
#> 4: 4 3 NA
#> 5: 5 6 NA
算法是:
c[i] = ifelse(a[i] < b[i] & c[i-1] < b[i], a[i], b[i])
我不想使用 for 循环,因为它太慢了。
我想使用 data.table 函数,或者像这样的快速方法:
x$c = fifelse(x$a < x$b & lag(x$c) < x$b, x$a, x$b)
但它不起作用,因为 x$c 计算正在进行中。
有什么解决办法吗?
感谢帮助
亚诺斯
您可以使用 Reduce
和 accumulate=T
选项:
library(data.table)
x = data.table(a = c(1:5), b = c(1,0,2,3,6), c = NA)
x$a[1] = NA
x$b[1] = NA
x[,c:=Reduce(f = function(prev,val) ifelse((val$a < val$b & prev<val$b),val$a,val$b),
x = split(.SD[-1],seq_len(.N-1)), init = NA
,accumulate = T)][]
#> a b c
#> <int> <num> <num>
#> 1: NA NA NA
#> 2: 2 0 0
#> 3: 3 2 2
#> 4: 4 3 3
#> 5: 5 6 5
Reduce
通过上一行计算的结果来计算下一行。
accumulate=T
returns 中间结果而不仅仅是最后一行。
我有一个 data.table x
,它有 2 列 a
,b
。
我想计算一个 c
列。
library(data.table)
x = data.table(a = c(1:5), b = c(1,0,2,3,6), c = NA)
x$a[1] = NA
x$b[1] = NA
x
#> a b c
#> <int> <num> <lgcl>
#> 1: NA NA NA
#> 2: 2 0 NA
#> 3: 3 2 NA
#> 4: 4 3 NA
#> 5: 5 6 NA
算法是:
c[i] = ifelse(a[i] < b[i] & c[i-1] < b[i], a[i], b[i])
我不想使用 for 循环,因为它太慢了。 我想使用 data.table 函数,或者像这样的快速方法:
x$c = fifelse(x$a < x$b & lag(x$c) < x$b, x$a, x$b)
但它不起作用,因为 x$c 计算正在进行中。 有什么解决办法吗?
感谢帮助 亚诺斯
您可以使用 Reduce
和 accumulate=T
选项:
library(data.table)
x = data.table(a = c(1:5), b = c(1,0,2,3,6), c = NA)
x$a[1] = NA
x$b[1] = NA
x[,c:=Reduce(f = function(prev,val) ifelse((val$a < val$b & prev<val$b),val$a,val$b),
x = split(.SD[-1],seq_len(.N-1)), init = NA
,accumulate = T)][]
#> a b c
#> <int> <num> <num>
#> 1: NA NA NA
#> 2: 2 0 0
#> 3: 3 2 2
#> 4: 4 3 3
#> 5: 5 6 5
Reduce
通过上一行计算的结果来计算下一行。
accumulate=T
returns 中间结果而不仅仅是最后一行。