假设以下表:
data <- data.table(dummy=1:10)
我知道你可以做以下事情:
data[dummy < 5, c("test1", "test2") := list("Yes", 1)]
并且:
data[, test1 := fcase(dummy < 5, "Yes")]
data[, test2 := fcase(dummy < 5, 1)]
我想把这些变成一个像这样:
data[, c("test1", "test2") := fcase(dummy < 5, list("Yes", 1))]
但它给我下错误:
Error in fcase(dummy < 5, list("Yes", 1)) :
Length of output value #2 must either be 1 or length of logical condition.
我需要经过多个过滤器,因此它是有道理的使用 fcase
. 我总是可以诉诸使用第一种解决方案的每个过滤器像这样:
data[dummy < 5, c("test1", "test2") := list("Yes", 1)]
data[dummy > 7, c("test1", "test2") := list("No", 0)]
data[between(dummy, 5, 7), c("test1", "test2") := list("Maybe", NA)]
但我想知道如果没有更多的东西可能的。 还有个解决方案的创建表与每个组合 test1
和 test2
合并本表的数据表后做一个 fcase
只 test1
像这样:
tests <- data.table(test1 = c("Yes", "No", "Maybe"),
test2 = c(1, 0, NA))
data[, test1 := fcase(dummy < 5, "Yes",
dummy > 7, "No",
between(dummy, 5, 7), NA_character_)]
merge(data, tests, by = "test1", all.x = T, sort = F)
但是,这似乎效率低下的一个大型和复杂的数据表