您是否能够引用 之外的列.R 数据表矢量化函数中的 SD 列?



>我有一个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_*列的值,其中:

  1. signal小于 0
  2. draw_*列为 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 版本的ifelsefifelse

最新更新