我有一个 data.table
library(data.table)
DT <- data.table(
signal = c(1, -1, -5),
draw_1 = c(NA, 3, NA),
draw_2 = c(NA, NA, 2)
)
> DT
signal draw_1 draw_2
1: 1 NA NA
2: -1 3 NA
3: -5 NA 2
而且我想把这些值替换成 draw_*
列,其中。
signal
小于0draw_*
栏目为NA所以想要的结果是。
> desired
signal draw_1 draw_2
1: 1 NA NA
2: -1 3 50
3: -5 50 2
我试着用我通常使用的方法 一次给列组赋值。
draws <- c("draw_1", "draw_2")
replacement <- 50
DT[,(draws) := ifelse( is.na(.SD) & signal<0, replacement, .SD), .SDcols=draws]
但结果却出现了错误
Error in `[.data.table`(DT, , `:=`((draws), ifelse(is.na(.SD) & signal < :
Supplied 2 columns to be assigned 6 items. Please see NEWS for v1.12.2.
我不明白这到底是怎么回事。我怀疑这跟使用了什么东西有关 signal
栏外 .SDcols
. 如果我做的不可能,有没有更好的方法来实现我的目标?
我们可以在列上循环使用 lapply
作为 ifelse
需要一个矢量和 .SD
是data.table的子集,基本上是一个向量列表。 在第一个参数,即 "test "中,它变为逻辑矩阵,但在最后一个参数,即 "no "中,它仍然是一个data.table。
library(data.table)
DT[,(draws) := lapply(.SD, function(x)
fifelse(is.na(x) & signal < 0, replacement, x)), .SDcols = draws]
DT
# signal draw_1 draw_2
#1: 1 NA NA
#2: -1 3 50
#3: -5 50 2
注意:这里,我们使用的是data.table版本的 ifelse
即 fifelse