r - 如何将使用 "case_when"的脚本转换为使用 "dt_case_when"的脚本

标签 r dplyr

我正在检查是否可以将我在某些脚本中使用的 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 with data.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/

相关文章:

R ggridges 图 - 显示 y 轴刻度和标签

r - 查找向量元素中第一次变化的索引

r - Shiny 的传单easyPrint插件

r - 找邻居的邻居

python - 在 R 或 Python 中迭代数据集并定位行索引

R:按因子 dplyr 计算矩阵汇总统计量

r - 如何将 2 个图(ggplot)合并为一个图?

R:从所有可能的组合中选择特定数量的组合

r - 使用 dplyr::lag 计算行之间的差异后保留第一行

r - 如何根据过滤条件添加计数列而不是在 dplyr 中分组?