你是否能够在R data.table向量函数中引用.SD列之外的列?

问题描述 投票:2回答:1

我有一个 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. 如果我做的不可能,有没有更好的方法来实现我的目标?

r data.table
1个回答
2
投票

我们可以在列上循环使用 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版本的 ifelsefifelse

© www.soinside.com 2019 - 2024. All rights reserved.