ifelse/case_when - 基于涉及两个变量的多个条件的新变量

ifelse/case_when - new variable based on multiple conditions involving two variables

问题已通过恢复运行代码前的数据解决

在这个论坛的几个已回答问题的帮助下,我创建了我的代码,但是,它并没有完全按预期工作,我感谢任何解决问题的提示和技巧。

我的目标是根据包含受访者教育水平的变量“v_236”和包含受访者规格的 v_236 创建一个新变量“v_edu_recoded” ,如果他们在 v_236 中选择了“6”(意思是“其他”)。 所以,新变量 v_edu_recoded 基本上应该是其他两个变量的合并。 v_edu_recoded 应与 v_236 相同。只有当 v_236 是 '6' 时,然后根据答案,它应该被重新编码为其他数字之一(因为大多数人给出的答案是“其他”,这已经包含在 [=34 的类别中) =]).

我的问题是,在输出中只列出了十个重新编码的案例(他们在 v_236 中选择了 6 个)。我的条件的第一部分(所有选择 1-5 的 832 个案例)没有工作,并给出了 NA。

知道如何解决这个问题吗? (我也通过“变异”尝试过,但结果更糟..) 谨致问候,非常感谢您的帮助!

这是我的代码:


dr_ma$v_edu_recoded <- with(dr_ma, ifelse(
  (v_236 == '1' & v_237 == '-99' | v_236 == '6' & v_237 == 'Schüler'), '1', ifelse( 
    (v_236 == '2' & v_237 == '-99'), '2', ifelse(
      (v_236 == '3' & v_237 == '-99'| v_236 == '6' & v_237 == 'Fachabitur'),'3', ifelse(
        (v_236 == '4' & v_237 == '-99' | v_236 == '6' & v_237 == 'Verwaltungsfachwirt'), '4', ifelse(
          (v_236 == '5' & v_237 == '-99'| v_236 == '6' & v_237 == 'Diplom'| v_236 == '6' & v_237 == 'Universität'),'5', ifelse(
            (v_236 == '6' & v_237 == 'meister'|v_236 == '6' & v_237 == 'Meister'|v_236 == '6' & v_237 == 'Fachakademie'),'6',NA
          )))))))

这是我的输出摘要:

> summary(dr_ma$v_edu_recoded)
   Length     Class      Mode 
      842 character character 
> frq(dr_ma$v_edu_recoded)

x <character>
# total N=842  valid N=10  mean=4.60  sd=1.58

Value |   N | Raw % | Valid % | Cum. %
--------------------------------------
    1 |   1 |  0.12 |      10 |     10
    3 |   1 |  0.12 |      10 |     20
    4 |   1 |  0.12 |      10 |     30
    5 |   4 |  0.48 |      40 |     70
    6 |   3 |  0.36 |      30 |    100
 <NA> | 832 | 98.81 |    <NA> |   <NA>

@CPak @caldwellst 感谢您的超级快速回复!我试了case_when,结果还是一样,可能是我的条件设置不对,但是找不到问题所在

dr_ma$v_edu_recoded3 <- case_when (dr_ma$v_236 == 1 & dr_ma$v_237 == -99 | dr_ma$v_236 == 6 & dr_ma$v_237 == 'Schüler' ~1, 
                                   dr_ma$v_236 == 2 & dr_ma$v_237 == -99 ~ 2,
                                   dr_ma$v_236 == 3 & dr_ma$v_237 == -99| dr_ma$v_236 == 6 & dr_ma$v_237 == 'Fachabitur' ~3,
                                   dr_ma$v_236 == 4 & dr_ma$v_237 == -99 | dr_ma$v_236 == 6 & dr_ma$v_237 == 'Verwaltungsfachwirt' ~ 4,
                                   dr_ma$v_236 == 5 & dr_ma$v_237 == -99| dr_ma$v_236 == 6 & dr_ma$v_237 == 'Diplom'| dr_ma$v_236 == '6' & dr_ma$v_237 == 'Universität' ~5,
                                   dr_ma$v_236 == 6 & dr_ma$v_237 == 'meister'|dr_ma$v_236 == 6 & dr_ma$v_237 == 'Meister'|dr_ma$v_236 == '6' & dr_ma$v_237 == 'Fachakademie' ~6,TRUE~NA_real_)
summary(dr_ma$v_edu_recoded3)
frq(dr_ma$v_edu_recoded3)
> summary(dr_ma$v_edu_recoded3)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   1.00    4.25    5.00    4.60    5.75    6.00     832 
> frq(dr_ma$v_edu_recoded3)

x <numeric>
# total N=842  valid N=10  mean=4.60  sd=1.58

Value |   N | Raw % | Valid % | Cum. %
--------------------------------------
    1 |   1 |  0.12 |      10 |     10
    3 |   1 |  0.12 |      10 |     20
    4 |   1 |  0.12 |      10 |     30
    5 |   4 |  0.48 |      40 |     70
    6 |   3 |  0.36 |      30 |    100
 <NA> | 832 | 98.81 |    <NA> |   <NA>

再次恢复运行代码前的数据,问题已解决。当运行

(dput(head(dr_ma, 10))

@CPak提出的,发现原来的数据被之前的多次recoding弄乱了,把它恢复到初始状态就是解决办法。