使用mutate+ifelse按条件生成gender_final列遇问题求助
问题:使用mutate+ifelse生成gender_final列未得到预期结果
我尝试用mutate + ifelse在数据集中创建新变量gender_final,预期规则是:当is_hoh == "yes"时取hoh_gender的值,当is_hoh == "no"时取resp_gender的值。
示例数据集:
df = structure(list(id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), resp_gender = c("female", "male", "female", "female", "male", "female", "male", "male", "female", "female"), hoh_gender = c("male", "male", "male", "male", "female", "male", "female", "female", "male", "male"), is_hoh = c("no", "no", "no", "yes", "no", "no", "yes", "no", "no", "yes"), gender_final = c("male", "male", "male", "female", "female", "male", "male", "female", "male", "female")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L))
我使用以下代码,但未得到准确结果:
mutate(gender_final = ifelse(is_hoh == "yes", hoh_gender, resp_gender))
解决方案
你的代码存在两个核心问题:
- 未指定操作数据集:
mutate需要结合管道符(%>%)明确指向要修改的df,否则无法正确更新数据。 - 规则与预期目标列不匹配:你描述的规则和示例数据里的
gender_final列逻辑完全相反——示例中的gender_final实际是:当is_hoh == "yes"时取resp_gender,当is_hoh == "no"时取hoh_gender。
情况1:按你描述的规则生成列
如果确实要实现你最初说的规则(is_hoh="yes"取hoh_gender,is_hoh="no"取resp_gender),正确代码如下:
library(dplyr) df <- df %>% mutate(gender_final = ifelse(is_hoh == "yes", hoh_gender, resp_gender))
生成结果如下:
| id | resp_gender | hoh_gender | is_hoh | gender_final |
|---|---|---|---|---|
| 1 | female | male | no | female |
| 2 | male | male | no | male |
| 3 | female | male | no | female |
| 4 | female | male | yes | male |
| 5 | male | female | no | male |
| 6 | female | male | no | female |
| 7 | male | female | yes | female |
| 8 | male | female | no | male |
| 9 | female | male | no | female |
| 10 | female | male | yes | male |
情况2:生成示例中的目标列
如果你的实际需求是得到示例数据里的gender_final列,只需调换ifelse的取值顺序:
library(dplyr) df <- df %>% mutate(gender_final = ifelse(is_hoh == "yes", resp_gender, hoh_gender))
运行后就能完全匹配示例中的gender_final列。
替代方案:使用case_when(更清晰的多条件写法)
如果后续需要添加更多条件判断,推荐用dplyr的case_when函数,逻辑更直观:
# 对应情况1的规则 df <- df %>% mutate(gender_final = case_when( is_hoh == "yes" ~ hoh_gender, TRUE ~ resp_gender )) # 对应情况2的规则(示例目标列) df <- df %>% mutate(gender_final = case_when( is_hoh == "yes" ~ resp_gender, TRUE ~ hoh_gender ))
内容的提问来源于stack exchange,提问作者Stephen Okiya
相关产品推荐
相关产品推荐

