R语言中基于多变量0值修正“不知道”变量的ifelse语句问题
问卷数据修正解决方案
原代码问题分析
你写的ifelse代码有两个关键问题:
- 结果部分用了
df_c$F4T1_SQ001_SQ008_pc_nicht==1这种条件判断,这会返回布尔值(TRUE/FALSE),而不是你要设置的1或0; - 没有把
ifelse的结果赋值给目标变量,所以代码只是返回判断结果,根本没修改原始数据框里的dk变量。
正确的基础写法
要真正修改dk变量,需要把ifelse的结果直接赋值给它,且结果分支直接写数值1和保留原有值(不要直接设为0,避免覆盖原本已经勾选“不知道”的案例):
df_c$F4T1_SQ001_SQ008_pc_nicht <- ifelse( df_c$F4T1_SQ001_SQ001_pc_privat == 0 & df_c$F4T1_SQ001_SQ002_pc_mathematik == 0 & df_c$F4T1_SQ001_SQ003_pc_deutsch == 0 & df_c$F4T1_SQ001_SQ004_pc_sachunterricht == 0 & df_c$F4T1_SQ001_SQ005_pc_englisch == 0 & df_c$F4T1_SQ001_SQ006_pc_sport == 0 & df_c$F4T1_SQ001_SQ007_pc_ethik == 0, 1, # 满足全0条件时设为1 df_c$F4T1_SQ001_SQ008_pc_nicht # 不满足时保持原有值 )
更简便的实现方法
如果变量数量多,手动写一堆&太麻烦,可以用rowSums结合列名匹配来简化:
- 先筛选出需要判断的所有选项变量(通过正则匹配列名):
# 匹配以F4T1_SQ001_SQ001到SQ007开头的变量 option_cols <- grep("^F4T1_SQ001_SQ00[1-7]_pc_", names(df_c), value = TRUE)
- 用
rowSums判断每行这些变量的和是否为0(全0的话和就是0),再修改dk变量:
df_c$F4T1_SQ001_SQ008_pc_nicht <- ifelse( rowSums(df_c[option_cols]) == 0, 1, df_c$F4T1_SQ001_SQ008_pc_nicht )
这种方法不仅代码更简洁,还能避免手动输入变量名时的拼写错误,后续变量数量变化时也更容易调整。
验证修改是否正确
可以通过以下方式确认数据是否修正到位:
- 查看dk变量的分布变化:
table(df_c$F4T1_SQ001_SQ008_pc_nicht)
- 抽查所有选项全为0的案例,看dk是否被设为1:
subset(df_c, rowSums(df_c[option_cols]) == 0, select = c(option_cols, "F4T1_SQ001_SQ008_pc_nicht"))
内容的提问来源于stack exchange,提问作者schnittbrot
相关产品推荐
相关产品推荐

