我正在检查是否可以将我在某些脚本中使用的 case_when 函数替换为 dt_case_when 函数,该函数似乎更快。当我检查以下代码时,似乎 TRUE 语句没有执行任何操作。有人找到了潜在的解决方案吗?谢谢!
我正在使用 case_when 函数复制脚本以查看预期结果。
df <- data.frame(Name = c("ID_1", "ID_2", "ID_3","ID_4"),
Status = c(NA_character_, "Alive", "Alive", NA_character_))
df %>%
mutate(
Value = case_when(
Status == "Alive" ~ 1,
TRUE ~ 0
)
)
df %>%
mutate(
Value = dt_case_when(
Status == "Alive" ~ 1,
TRUE ~ 0
)
)
TRUE 在 dt_case_when 中不像在 case_when 中那样工作
最佳答案
出现此问题的原因是 NA
Status
中的值。 TRUE ~ 0
部分dplyr::case_when()
是在不满足其他条件时分配的默认值。 Status == "Alive"
计算结果不为 TRUE
对于 NA
,所以结果是0
对于 NA
值。
相反,如tidyfast::dt_case_when()
docs状态,功能:
Does what
dplyr::case_when()
does, with the same syntax, but withdata.table::fifelse()
under the hood.
这本质上意味着您正在这样做:
df |>
mutate(
Value = data.table::fifelse(Status == "Alive", 1, 0)
)
# Name Status Value
# 1 ID_1 <NA> NA
# 2 ID_2 Alive 1
# 3 ID_3 Alive 1
# 4 ID_4 <NA> NA
如您所见,与 case_when()
不同, data.table::fifelse()
返回NA
如果正在测试的值为 NA
。这与 base::ifelse()
的行为相同。和 dplyr::if_else()
.
如果您需要更快的替代方案 dplyr::case_when()
,你可以只使用 data.table::fcase()
,与 NA
具有相同的行为值为 case_when()
.
这可以使用 dplyr
来完成语法:
df %>%
mutate(
Value = data.table::fcase(
Status == "Alive", 1,
default = 0
)
)
# Name Status Value
# 1 ID_1 <NA> 0
# 2 ID_2 Alive 1
# 3 ID_3 Alive 1
# 4 ID_4 <NA> 0
或者只使用data.table
:
library(data.table)
setDT(df)
df[, Value := fcase(
Status == "Alive", 1,
default = 0
)]
# Same result
关于r - 如何将使用 "case_when"的脚本转换为使用 "dt_case_when"的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77045295/