使用case_when处理character(0)时无法正确映射为'Other'的问题排查
嘿,这个问题我之前也碰到过!其实问题出在case_when的设计逻辑上——它是个向量化函数,必须保证输出和输入的向量长度一致。当你传入character(0)(长度为0的向量)时,不管你写什么条件,它都会返回同样长度的空向量,哪怕identical(test_vec, character(0))返回的是TRUE,这个TRUE是长度为1的标量,和输入的长度0不匹配,所以case_when根本不会触发这个分支。
解决办法1:用if/else先判断空向量
这是最直接的方式,先检查输入是否为空,再分情况处理:
test_vec <- character(0) if (identical(test_vec, character(0))) { 'Other' } else { case_when( test_vec == '1100' ~ 'House', TRUE ~ 'Other' # 可选:处理其他非1100的正常值 ) }
测试验证:
- 当
test_vec = '1100',返回[1] "House" - 当
test_vec = character(0),返回[1] "Other" - 当
test_vec = '2200',返回[1] "Other"
解决办法2:封装成函数复用
如果需要频繁处理这类场景,可以把逻辑封装成函数,用起来更顺手:
map_category <- function(vec) { # 先判断是否为空向量 if (length(vec) == 0) { return('Other') } # 正常处理非空向量的映射 case_when( vec == '1100' ~ 'House', TRUE ~ 'Other' ) } # 测试用例 map_category('1100') # [1] "House" map_category(character(0)) # [1] "Other" map_category('3300') # [1] "Other"
这里用length(vec) == 0判断空向量和identical一样可靠,而且写法更简洁。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

