我想利用快速的data. table::fcase()而不是使用derryr::case_when(),但我不知道如何将给定行的值保持为默认值(而不是固定值).

说你有

dt <- data.table(v1 = c("1","2", "3", NA))

使用dr.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

但在这种情况下,dplyrdata.table的"合并"功能更适合that逻辑:

dt |>
  mutate(v2 = coalesce(v1, "0"))
#        v1     v2
#    <char> <char>
# 1:      1      1
# 2:      2      2
# 3:      3      3
# 4:   <NA>      0
dt[, v2 := fcoalesce(v1, "0")]
#        v1     v2
#    <char> <char>
# 1:      1      1
# 2:      2      2
# 3:      3      3
# 4:   <NA>      0

R相关问答推荐

根据固定值范围在tible中添加新行

如何在四进制仪表板值框中显示值(使用shiny 的服务器计算)

删除facet_wrap标签之间的水平线

如何在modelsummary中重命名统计数据?

R中插入符号训练函数的中心因子和尺度因子预测

当我们有多个反斜杠和/特殊字符时使用Gsubing

R如何将列名转换为更好的年和月格式

我们如何在R中透视数据并在之后添加计算

如何将一些单元格的内容随机 Select 到一个数据框中?

观察器中的inaliateLater的位置

将具有坐标列表列的三角形转换为多个多边形

减少雨云面之间的间距并绘制所有统计数据点

在使用SliderInput In Shiny(R)设置输入数据的子集时,保留一些情节痕迹

按镜像列值自定义行顺序

将边列表转换为路径长度列表

R,将组ID分配给另一个观测ID变量中的值的组合

从多行中 Select 最小值

Data.table条件合并

将`magick`对象转换为原始向量

R:部分修改矩阵对角线的有效方法