R中dplyr::case_when()返回向量长度超预期的原因探究
dplyr::case_when() 长度异常问题解析
问题重现
使用case_when()时出现判断条件长度为1,但返回向量长度超出预期的情况:
g <- list("something", c(1:10)) case_when( g[[1]] == "not something" ~ sum(g[[2]]), g[[1]] == "something" ~ g[[2]][3], TRUE ~ g[[2]] )
预期结果为单个值3,但实际返回由11个3组成的向量(注:实际测试应为10个,可能是笔误),且未触发文档描述的长度不一致报错。
官方文档说明(翻译)
返回值
长度为1或n的向量,与逻辑输入或输出向量的长度匹配,类型(及属性)与第一个右侧值(RHS)一致。长度或类型不一致会触发错误。
问题原因解析
自动广播机制
case_when()会自动将长度为1的条件或右侧值循环广播,以匹配最长的输入向量长度。你的代码中第三个分支TRUE ~ g[[2]]的右侧是长度为10的向量,因此前面所有长度为1的条件和右侧值都会被重复10次,最终输出长度被拉到10(而非预期的1)。未触发报错的原因
文档中提到的“长度不一致报错”,指的是同一条件-右侧配对的长度不兼容(比如条件长度为2,对应右侧长度为3),或者不同条件之间的长度不匹配。而长度1的条件/值与任意长度n的向量是兼容的,dplyr会默认做广播处理,因此不会触发错误。获取预期单个值的方法
如果希望返回单个值,需要确保所有分支的右侧值长度均为1,比如修改第三个分支:
case_when( g[[1]] == "not something" ~ sum(g[[2]]), g[[1]] == "something" ~ g[[2]][3], TRUE ~ g[[2]][1] # 改为单个值 )
内容的提问来源于stack exchange,提问作者SlickActuary
相关产品推荐
相关产品推荐

