【问题标题】:How to keep the missing values when using ifelse in R在 R 中使用 ifelse 时如何保留缺失值
【发布时间】:2022-06-11 09:06:26
【问题描述】:

我有如下数据子集。我想创建一个新列来说明如果 x1、x2 和 x3 列中的所有值都是 1,则“是”,如果是 2,则“否”。

structure(list(x1 = c("1", "1", "1", "2", NA, "2", "2", NA,NA, "1", "1", "1"), 
           x2 = c(NA, NA, "1", NA, "2", NA, "2", "2", "1", "1", "1", "1"), 
           x3 = c(NA, NA, "1", NA, "2", NA,"1", "1", "2", "1", "2", "1")), 
           class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -12L))

我在下面尝试过,但它不正确。感谢您的帮助。

d$new <- ifelse(!is.na(d$x1 ==1 & d$x2 ==1 d$x3 ==1 ), "yes","no")

【问题讨论】:

  • 所以如果三个都是 1,那么你想要“是”,但两个都是 1,然后是“否”。但是如果只有一个是 1 呢? 2和NA有区别吗?此外,您似乎将实际的NA 值与具有"NA" 值的字符串结合起来有点奇怪。你知道你的数据是怎么发生的吗?因为这可能是您首先要解决的问题。
  • @MrFlick 我修复了“NA”,但这只是我的大数据的一个例子。我想说的是,如果所有列(变量)都是 1,则说“是”,如果所有列(变量)都是 2,则说“否”并将 NAs 保持为 NAs

标签: r dataframe if-statement


【解决方案1】:

试试这个

d$new <- ifelse(d$x1 ==1 & d$x2 ==1 & d$x3 ==1 , "yes",
               ifelse(d$x1 ==2 & d$x2 ==2 & d$x3 ==2 , "no", NA))

【讨论】:

  • 这不是我想要的。请看我的评论。谢谢
  • 这次编辑怎么样?
【解决方案2】:
d$new <- ifelse(apply(d==1, 1, prod), 'yes', 'no')

d==1TRUEFALSENA 创建一个逻辑矩阵,其中1,而不是1 和NA 分别在d 中。然后,将prod 应用于此矩阵的行,如果有所有TRUE,则得到1,如果至少有一个FALSE(并且没有NA),则得到0,而NA 则至少有一个NA

【讨论】:

    【解决方案3】:

    您可以尝试使用 tidyverse 中的 case_when 表达式来完成此操作。 您需要先激活 tidyverse 库:

    library(tidyverse)
    

    之后代码将如下所示:

    df <- structure(list(x1 = c("1", "1", "1", "2", "NA", "2", "2", "NA","NA", "1", "1", "1"), 
               x2 = c(NA, NA, "1", "NA", "2", "NA", "2", "2", "1", "1", "1", "1"), 
               x3 = c(NA, NA, "1", NA, "2", "NA","1", "1", "2", "1", "2", "1")), 
          class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -12L))
    

    编辑:还为 NA 添加了检查语句。在 tidyverse 中的 case_when 中,NA 需要属于正确的类别。因为,我们这里的新列的类应该是char,所以已经包含了as.charcter(NA)。

    df <- df |> mutate(new_col = case_when(
      x1 == 1 & x2 == 1 & x3 == 1 ~ "Yes",
      x1 == 2 & x2 == 2 & x3 == 2 ~ "No",
      is.na(x1) | is.na(x1) | is.na(x1) ~ as.character(NA)))
    

    mutate 表达式创建一个新列,并且 case when 用于执行 if else 条件。如需更多说明,您可以访问此链接https://stringr.tidyverse.org/

    【讨论】:

    • 谢谢。但是我想对每一行说,如果所有的值都是 1 ,那么说“是”,如果都是 2 说,“否”,如果有任何 NA ,请将其保留为 NA
    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2015-07-22
    • 2016-11-10
    • 2016-10-25
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多