如何用data.table的fcase实现dplyr case_when的原列值默认保留功能?
用data.table的fcase实现dplyr case_when的保留原始值逻辑
原dplyr代码通过TRUE ~ x在所有条件不满足时保留x列的原始值,但直接给fcase的default参数传x会报错——因为default要求传入长度为1的标量,不能是向量类型的整列数据。
你可以通过以下两种方式实现等效逻辑:
方法1:添加最后一个TRUE条件匹配剩余情况
这是最贴合原case_when逻辑的方式,按顺序匹配条件,最后用TRUE覆盖所有未满足前面条件的行,返回对应行的原始x值:
library(data.table) df = setDT(df)[, x := fcase( col1 == "a" & col2 == "b", "m1", col1 == "b" & col2 == "a", "m2", TRUE, x )]
方法2:结合coalesce处理NA结果
先让fcase在无匹配条件时返回NA,再用data.table::coalesce优先取fcase的结果,若为NA则取原始x值:
library(data.table) df = setDT(df)[, x := coalesce( fcase( col1 == "a" & col2 == "b", "m1", col1 == "b" & col2 == "a", "m2" ), x )]
两种方法都能实现和原case_when完全一致的效果,其中方法1的结构更接近原代码,推荐使用。
内容的提问来源于stack exchange,提问作者elieli
相关产品推荐
相关产品推荐

