使用R语言case_when函数重新编码新变量时遇到的问题
解决你的R语言变量重编码问题
我来帮你梳理下代码里的问题,以及对应的修正方案:
你的代码核心问题:
- 未保存管道操作结果:你第二个
mutate用了管道,但没有把计算结果赋值回jungmodell,所以原数据框还是停留在第一个mutate的状态(也就是Identifikationsskala完全等于Parteinah),自然看不到编码后的变化。 - 管道内错误引用数据框名:使用
dplyr管道时,不需要用jungmodell$来调用列,直接写列名即可,这样代码更简洁,还能避免潜在的作用域问题。 - 未提前筛选目标样本:你需要先排除
Parteinah为-8、-9的无效样本,同时只保留Parteinah ==1或者parteisympathie为1-3的有效样本,再进行编码操作。
修正后的完整代码:
# 筛选有效样本 + 创建新变量 + 保存回原数据框 jungmodell <- jungmodell %>% # 第一步:过滤掉无效样本,只保留需要的样本 filter( Parteinah != -8, Parteinah != -9, (Parteinah == 1) | (parteisympathie %in% 1:3) ) %>% # 第二步:根据规则创建Identifikationsskala mutate( Identifikationsskala = case_when( Parteinah == 1 ~ 1, parteisympathie == 1 ~ 4, parteisympathie == 2 ~ 3, parteisympathie == 3 ~ 2, # 前面已经筛选过,这里理论上不会触发,用NA标记意外情况 TRUE ~ NA_real_ ) )
代码细节解释:
filter步骤:先剔除Parteinah=-8/-9的无效样本,同时只保留两类有效样本——Parteinah=1的受访者,以及parteisympathie为1-3的受访者,确保后续编码只针对目标人群。mutate里的case_when:因为已经提前筛选过,Parteinah>=2的样本必然对应parteisympathie=1-3,所以不需要重复判断Parteinah>=2,直接根据parteisympathie的值完成反向编码即可,逻辑更简洁。- 整个管道结果赋值回
jungmodell,这样你的数据框就会更新为包含正确新变量的版本。
如果你不想删除无效样本,而是把这些样本的Identifikationsskala设为缺失值(比如NA),可以去掉filter步骤,调整case_when逻辑:
jungmodell <- jungmodell %>% mutate( Identifikationsskala = case_when( # 有效样本的编码规则 Parteinah == 1 ~ 1, Parteinah >=2 & parteisympathie ==1 ~4, Parteinah >=2 & parteisympathie ==2 ~3, Parteinah >=2 & parteisympathie ==3 ~2, # 无效样本设为NA TRUE ~ NA_real_ ) ) %>% # 若需要完全移除NA样本,可加上这一步 filter(!is.na(Identifikationsskala))
这样就能得到你想要的Identifikationsskala变量啦!
内容的提问来源于stack exchange,提问作者franca122
相关产品推荐
相关产品推荐

