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]]
我有以下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]]