dplyr中case_when报错疑问:为何需用as.numeric包裹Q12?
dplyr::case_when兜底条件需用as.numeric的原因解释
先看你遇到问题的代码:
library(dplyr) df = data.frame(hcat = 1:5, Q12 = 41:45) df |> mutate(Q12_test = case_when(hcat <= 3 & Q12 == 41 ~ 40, hcat == 5 & Q12 == 42 ~ 41, hcat == 5 & Q12 == 43 ~ 42, TRUE ~ Q12))
运行这段代码会报错,移除TRUE ~ Q12兜底分支能正常执行,但要保留原始值而非转为NA时,必须用TRUE ~ as.numeric(Q12)才能正常运行,核心原因如下:
关键规则:case_when要求所有分支类型一致
case_when的核心要求是:所有满足条件的分支必须返回相同数据类型的结果,否则会触发类型不匹配错误。
具体冲突点
- 你代码里前三个分支的返回值
40、41、42是R默认的双精度浮点数(double)(R中直接写不带L后缀的数字都是double类型)。 - 而
data.frame里用41:45创建的Q12列是**整数型(integer)**向量。 - 当兜底分支直接返回
Q12时,integer类型和前面的double类型冲突,导致报错。
两种可行的解决方式
- 把兜底列转为double类型:用
as.numeric(Q12)将整数型的Q12转为double,和前三个分支的类型统一:
df |> mutate(Q12_test = case_when(hcat <= 3 & Q12 == 41 ~ 40, hcat == 5 & Q12 == 42 ~ 41, hcat == 5 & Q12 == 43 ~ 42, TRUE ~ as.numeric(Q12)))
- 把前三个分支转为整数类型:给前三个分支的数值加
L后缀,明确指定为整数型,这样兜底分支直接返回Q12(integer类型)也能匹配:
df |> mutate(Q12_test = case_when(hcat <= 3 & Q12 == 41 ~ 40L, hcat == 5 & Q12 == 42 ~ 41L, hcat == 5 & Q12 == 43 ~ 42L, TRUE ~ Q12))
内容的提问来源于stack exchange,提问作者deschen
相关产品推荐
相关产品推荐

