使用 data.table::fcase() 而不是 dplyr::case_when() 时保留值

问题描述 投票:0回答:1

我想利用快速的 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

如何解决?

r data.table
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.