【问题标题】:combining 2 columns using ifelse dropping a variable R使用 ifelse 合并 2 列删除变量 R
【发布时间】:2019-11-05 00:26:19
【问题描述】:

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

构建数据框:

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 在其中具有值,则应为男性。 我尝试过的:

  • 使用嵌套的 if-else 语句构建一个性别列
  • 制作两列,然后使用合并
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

【问题讨论】:

  • 根据定义,一列有一个值。您想如何处理同时分配两个性别的情况?
  • 您确定您已正确创建数据框吗?我认为在最后一行应该是cbind 而不是rbind。您还可以使用预期的输出更新您的帖子吗?

标签: r if-statement multiple-columns


【解决方案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,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_))

【讨论】:

  • 只需在您的帖子中添加内容即可。可以使用NANA 类型:NA_character_
  • @slava-kohut,非常感谢。很高兴知道。我已经编辑了我的答案。
  • 太棒了!我很高兴它有帮助。
  • 如果我想使用 & 语句而不是 or 语句怎么办?这仍然有效吗?
  • 当然,你需要弄清楚逻辑。在您的示例中,您将为新变量 sex 生成所有 NA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多