首页 > 解决方案 > 使用 ifelse 合并 2 列删除变量 R

问题描述

我正在尝试将我创建的男性和女性列合并为一列。我尝试使用我在堆栈上找到的一些答案,但我查询的第二个性别被排除在外。

构建数据框:

ID <- 1:10
SPAYDT <- c("", "2011-12-01", "", "2006-05-01", "", "", "", "", "", "")
SPAYDTU <- c(1, NA, NA, NA, NA, NA, NA, NA, NA, NA)
NEUTDT <- c("", "", "", "", "", "", "2013-03-01", "", "", "")
NEUTDTU <- c(NA, NA, NA, NA, NA, NA, NA, 1, NA, NA)
df <- as.data.frame(cbind(ID, SPAYDT, SPAYDTU, NEUTDT, NEUTDTU))
df

目标是有一个性别列,格式为具有 2 个级别的因素 - 男性和女性 如果 SPAYDT 或 SPAYDTU 在其中具有值,则应该说女性,如果 NEUTDT 或 NEUTDTU 在其中具有值,则应该说男性。我试过的:

df$male <- ifelse(NEUTDT!="", "Male",
                  ifelse(NEUTDTU=1, "Male", NA))
df$female <- ifelse(SPAYDT!="", "Female",
                    ifelse(SPAYDTU==1, "Female", NA))
df$sex <- ifelse(!is.na(df$female), df$female, df$male)

df$sex <- ifelse(SPAYDT!="", "Female",
                 ifelse(SPAYDTU==1, "Female",
                        ifelse(NEUTDT!="", "Male",
                               ifelse(NEUTDTU=1, "Male", NA))))

但是,无论我做什么,最后的性别栏都只有一种性别。我确保附加了我的 df 以将列名用作变量。我尝试重新启动 R 并再次运行设置代码。我只是不知道为什么 ifelse 语句忽略了第二性输入。

任何帮助是极大的赞赏!

澄清:在我正在使用的较大数据框中,我已经完成了数据清理,以便每个 ID 仅对应于 1 种性别。很抱歉代码中的错误。

期望的输出:

ID <- 1:10
SPAYDT <- c("", "2011-12-01", "", "2006-05-01", "", "", "", "", "", "")
SPAYDTU <- c(1, NA, NA, NA, NA, NA, NA, NA, NA, NA)
NEUTDT <- c("", "", "", "", "", "", "2013-03-01", "", "", "")
NEUTDTU <- c(NA, NA, NA, NA, NA, NA, NA, 1, NA, NA)
SEX <- c("Female", "Female", NA, "Female", NA, NA, "Male", "Male", NA, NA)
df <- as.data.frame(cbind(ID, SPAYDT, SPAYDTU, NEUTDT, NEUTDTU, SEX))
df

标签: rif-statementmultiple-columns

解决方案


这就是你所追求的吗?

ID <- 1:10
SPAYDT <- c("", "2011-12-01", "", "2006-05-01", "", "", "", "", "", "")
SPAYDTU <- c(1,NA,NA,NA,NA,NA,NA,NA,NA,NA)
NEUTDT <- c("", "", "", "", "", "", "2013-03-01", "", "", "")
NEUTDTU <- c(NA,NA,NA,1,NA,NA,NA,NA,NA,NA)
df <- data.frame(ID, SPAYDT, SPAYDTU, NEUTDT, NEUTDTU)

df %>% 
 mutate(
   sex = case_when(
      NEUTDT!="" | NEUTDTU==1 ~ "Male", 
      SPAYDT!="" | SPAYDTU==1 ~ "Female", 
      TRUE ~ NA_character_))

推荐阅读