我想利用快速的 data.table::fcase() 而不是使用 dplyr::case_when(),但我不知道如何将给定行的值保留为默认值(而不是固定的值)值)
说你有
dt <- data.table(v1 = c("1","2", "3", NA))
使用 dplyr 的
case_when()
dt %>%
mutate( v2 = case_when(is.na(v1) ~ "0",
TRUE ~ v1))
你得到了预期的结果
> dt %>%
+ mutate( v2 = case_when(is.na(v1) ~ "0",
+ TRUE ~ v1))
v1 v2
1: 1 1
2: 2 2
3: 3 3
4: <NA> 0
使用 data.table 的
fcase()
dt[ , v2 := fcase(is.na(v1), "0",
default = v1)]
(或任何类似于该代码的内容)您会收到错误
> dt[ , v2 := fcase(is.na(v1), "0",
+ default = v1)]
Error in fcase(is.na(v1), "0", default = v1) :
Length of 'default' must be 1.
我相信,因为
v1
被视为完整的专栏v1
如何解决?
data.table
-等价于dplyr::case_when(TRUE ~ expr)
是fcase(rep(TRUE, .N), expr)
。
dt[ , v2 := fcase(is.na(v1), "0", rep(TRUE, .N), v1)]
# v1 v2
# <char> <char>
# 1: 1 1
# 2: 2 2
# 3: 3 3
# 4: <NA> 0