R语言使用case_when()按多变量条件新建教育婚配分类变量
错误原因
原代码存在两处核心逻辑问题:
- 条件判断误用逻辑或运算符
|:case_when()按从上到下的优先级匹配条件,只要满足分支内任意一个条件就返回对应值。第一个分支条件(SpouseEducation > EducationLevel) | (Female == 1)会让所有Female==1的女性观测直接命中该分支,完全跳过教育水平对比逻辑,所有女性都会被错误归为女性向上婚;男性观测同理也会优先匹配到第一个符合Female==0的分支,结果完全不符合实际分类规则。 - 未统一婚配类型的判断参照系:分类规则固定以「妻子受教育水平 vs 丈夫受教育水平」为基准,但原代码直接对比当前行自身教育水平和配偶教育水平,没有根据观测性别调整对比方向,自然无法得到正确结果。
修正思路
所有分类以夫妻对为单位,固定对比妻子和丈夫的受教育水平,和当前观测的性别无关:
- 若当前行是女性观测(
Female == 1):本人为妻子,配偶为丈夫,直接对比本人教育水平和配偶教育水平即可 - 若当前行是男性观测(
Female == 0):本人为丈夫,配偶为妻子,对比方向需要反过来 - 妻子教育水平 < 丈夫教育水平:归类为
FemaleHypergamy(女性向上婚) - 妻子教育水平 == 丈夫教育水平:归类为
FemaleHomogamy(女性同质婚) - 妻子教育水平 > 丈夫教育水平:归类为
FemaleHypogamy(女性向下婚)
该逻辑天然保证同一夫妻对的两条观测分类结果完全一致,不需要额外按配偶ID分组处理。
可运行修正代码
可读性更高的版本(推荐)
通过临时中间变量统一对齐妻子、丈夫的教育水平,逻辑清晰不容易写错:
library(dplyr) df2 <- df1 %>% mutate( # 对齐夫妻双方的教育水平到固定角色 wife_edu = ifelse(Female == 1, EducationLevel, SpouseEducation), husband_edu = ifelse(Female == 1, SpouseEducation, EducationLevel), # 按统一规则分类 edu_category = case_when( wife_edu < husband_edu ~ "FemaleHypergamy", wife_edu == husband_edu ~ "FemaleHomogamy", wife_edu > husband_edu ~ "FemaleHypogamy" ) ) %>% # 移除临时生成的中间变量 select(-wife_edu, -husband_edu)
简洁版本(无中间变量)
如果不想生成临时列,也可以直接用逻辑与&拼接判断条件,效果完全一致:
library(dplyr) df2 <- df1 %>% mutate( edu_category = case_when( (Female == 1 & EducationLevel < SpouseEducation) | (Female == 0 & EducationLevel > SpouseEducation) ~ "FemaleHypergamy", EducationLevel == SpouseEducation ~ "FemaleHomogamy", (Female == 1 & EducationLevel > SpouseEducation) | (Female == 0 & EducationLevel < SpouseEducation) ~ "FemaleHypogamy" ) )
内容的提问来源于stack exchange,提问作者Valerie Li
相关产品推荐
相关产品推荐

