R data.table 使用 ifelse 通过引用分配两列

R data.table assign two columns by reference using ifelse

我有以下data.table

library(data.table)
x <- data.table(a = 1:3, b = 1:6) 

而且我想通过引用同时分配两列,因为两列使用相同类型的检查。通常我会这样做:(Assign multiple columns using := in data.table, by group)

x[, c("col1", "col2") := list("Yes", b)]

但我需要一个 ifelse 结构。所以我尝试了:

x[, c("col1", "col2") := ifelse(a > 2, list("Yes", b), list("No", a))]

但这不起作用,我得到一个错误:

Supplied 2 columns to be assigned 6 items

我该如何解决?

您可以使用 if ... else ... 代替 ifelse()

尝试下面的代码
x <- data.table(a = 1:3, b = 1:6)
x[,
  c("col1", "col2") :={
    if (a > 2) list("Yes", b) else list("No", a)
  },
  by = 1:nrow(x)
][]

这给出了

   a b col1 col2
1: 1 1   No    1
2: 2 2   No    2
3: 3 3  Yes    3
4: 1 4   No    1
5: 2 5   No    2
6: 3 6  Yes    6

你可以:

x[, c("col1", "col2") := .("No", a)] # Default value
x[a > 2, c("col1", "col2") := .("Yes", b)] # .() is short for list()

另一种泛化效果更好的选择 更复杂的情况:

x[, test_a := a > 2]
update_table <- data.table(
  test_a = c(TRUE, FALSE),
  col1 = c('Yes', 'No'),
  col2 = c('a', 'b')
)
cols <- c('col1', 'col2')
x[, (cols) := update_table[.SD, on = 'test_a', .SD, .SDcols = cols]]