我正在尝试从 dplyr case_when 更改为 data.table fcase 函数以解决速度问题。
我在 case_when 中的原始脚本如下所示:
df = dplyr::mutate(df, x = dplyr::case_when(
col1 == "a" & col2 == "b" ~ "m1",
col2 == "b" & col1 == "a" ~ "m2",
TRUE ~ x
))
因此,如果没有满足任何条件,我只需保留原始列值。我正在尝试对 fcase 做同样的事情:
df = setDT(df)[, x := fcase(
col1 == "a" & col2 == "b", "m1",
col2 == "b" & col1 == "a", "m2",
default = x
)]
但是,当我尝试运行此程序时,出现以下错误:
Error in fcase(col1 == "a" & col2 == :
Length of 'default' must be 1.
如果我将默认值设置为任何字符串,它就可以正常工作。如果可能的话,谁能告诉我如何使用 fcase 复制我的 case_when 代码?谢谢!
虽然它可能不那么优雅,但我使用
rep(TRUE, .N)
。
DT <- data.table(i = 1:6)
DT[, v := fcase(i %in% c(1,3), "A", i %in% c(2), "B",
rep(TRUE, .N), as.character(i))][]
# i v
# <int> <char>
# 1: 1 A
# 2: 2 B
# 3: 3 A
# 4: 4 4
# 5: 5 5
# 6: 6 6