>我有一个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")中,它更改为逻辑矩阵,但最后一个参数即"否",它仍为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