如何在R中按指定条件合并两个数据框的性别列?
解决方案
你之前使用的unite()仅用于多列字符串拼接,不支持按规则条件取值,适合当前需求的实现方式如下:
方法1:使用dplyr的case_when()(可读性最高,推荐新手使用)
case_when()按从上到下的顺序匹配条件,满足条件即返回对应值,逻辑和你的需求完全匹配:
library(dplyr) all_data1 <- all_data %>% # 先将性别列转为字符型,避免因子类型赋值时报错 mutate(across(c(Sex.x, Sex.y), as.character), F_Sex = case_when( # 两列值相等时取对应值 Sex.x == Sex.y ~ Sex.x, # Sex.x为NA时取Sex.y的有效值 is.na(Sex.x) ~ Sex.y, # Sex.y为NA时取Sex.x的有效值 is.na(Sex.y) ~ Sex.x, # 剩余未匹配的情况为两值不等,返回? TRUE ~ "?" )) # 若需要删除原有的Sex.x、Sex.y列,可在管道末尾加 select(-Sex.x, -Sex.y)
如果你的列名实际为sexo.x和sexo.y,替换代码中对应的列名即可。
方法2:嵌套if_else()实现
如果你需要使用if_else()函数完成,可以用多层嵌套实现相同逻辑,可读性略低于case_when():
all_data1 <- all_data %>% mutate(across(c(Sex.x, Sex.y), as.character), F_Sex = if_else(Sex.x == Sex.y, Sex.x, if_else(is.na(Sex.x), Sex.y, if_else(is.na(Sex.y), Sex.x, "?"))))
内容的提问来源于stack exchange,提问作者Andrés Felipe Tigreros-Andrade
相关产品推荐
相关产品推荐

