【问题标题】:New column with nested if else based on two columns, ignoring NA if present in only one other column基于两列的嵌套 if else 的新列,如果仅存在于另一列中则忽略 NA
【发布时间】:2018-03-03 03:06:29
【问题描述】:

我有一个包含两个变量 var1 和 var2 的数据集。有些情况在 var1 中有值,有些在 var2 中。 var1 中有值的情况在 var2 中为 NA,反之亦然。我想将这些变量合并为一个值为 1 或 0。如果 var1 OR var2 的值为 1,则新变量的值应为 1,如果 var1 或 var2 的值为 0,则为 0,并且仅当 var1 和 var2 均为 NA 时才为 NA。

基本上,我要做的是让 R 忽略 var1 或 var2 中的 NA(如果另一个值存在),并且仅返回 NA 是 NA 存在于两个变量中。

我尝试了以下解决方案:

第一次尝试:

df$new_var<-ifelse(df$var1==1|df$var2==1,1,
                    ifelse(df$var1<1|df$var2<1,0,
                        ifelse(is.na(df$var1)&df$var2<1,0,0
                           ifelse(is.na(df$var2)&df$var1<1,0,0))))

第二次尝试:

df$new_var<-ifelse(df$var1==1|df$var2==1,1,
                    ifelse(df$var1==0|df$var2==0,0,NA)) 

第三次尝试:

df$new_var<-ifelse(df$var1==1|df$var2==1,1,
                    ifelse(df$var1==0|df$var2==0,0,NA))

All 返回一个有 1 和 NA 且没有 0 的变量。

我做错了什么?

【问题讨论】:

  • 如果值为 1 和 0 怎么办?
  • @Moody_Mudskipper - OP 指定只有一个变量可以具有除 NA 以外的值 - “var1 中具有值的情况在 var2 中是 NA,反之亦然” - 所以它实际上是一个更简单的问题比看起来:)
  • 为了将来参考,数据样本和预期输出将非常有助于说明您的目标。
  • 是的,我看到了,以后会记住这一点。

标签: r if-statement


【解决方案1】:

使用pmax

df <- expand.grid(c(1, 0, NA), c(1, 0, NA))
df$new_var <- pmax(df$Var1, df$Var2, na.rm = TRUE)

> df
  Var1 Var2 new_var
1    1    1       1
2    0    1       1
3   NA    1       1
4    1    0       1
5    0    0       0
6   NA    0       0
7    1   NA       1
8    0   NA       0
9   NA   NA      NA

【讨论】:

    【解决方案2】:

    我知道的最简单的方法是使用dplyr::coalesce

    dplyr::coalesce(c(1,0,0,NA), c(1, NA, 1, 1))
    #> [1] 1 0 0 1
    

    如果有人为你做了,为什么还要写表达式来做呢? ;)

    【讨论】:

    • 这不适用于第三个值,因为第二个数组是 1,应该返回 1 而不是 0
    • 我花了一段时间才理解问题的参数,但我相信“var1 中的值在 var2 中为 NA,反之亦然”的意思是 IF var1 is NA, then var2 is not 和 @987654324 @。换句话说,每一对中恰好有一个是NA。如果没有预期的输入和输出,这是很难看到的。这两种解决方案都有效,但pmax 解决方案更快。
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多