Можете ли вы ссылаться на столбцы вне столбцов .SD в векторной функции R data.table? - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть 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. Если то, что я делаю, невозможно, есть ли лучший способ достичь sh моей цели?

1 Ответ

2 голосов
/ 22 апреля 2020

Мы можем l oop по столбцам с lapply, поскольку ifelse требует вектора, а .SD - это Подмножество data.table, которое в основном представляет собой список векторов. В первом аргументе, то есть «тест», он меняется на логическую матрицу, но в последнем аргументе, т.е. «нет», он остается в виде 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

ПРИМЕЧАНИЕ. Здесь мы используем данные .table версия ifelse т.е. fifelse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...