【问题标题】:Why is this ifelse statement producing NAs?为什么这个 ifelse 语句会产生 NA?
【发布时间】:2019-05-29 16:23:26
【问题描述】:

我正在尝试根据我的数据集中的其他变量创建一个新变量。我已经使用 ifelse 来完成类似的任务,但是当我这次尝试它时,当条件不满足时,我得到 NA。

我要作为新变量基础的变量都是二进制的——“是”或“否”。如果任何其他变量为“是”,我希望将新变量编码为“是”,如果它们都没有编码为“是”,则为“否”。当我运行 ifelse 时,我得到了预期的“是”数,但我期望的“否”是 NA。

我尝试了以下方法:

data$new <- ifelse(var1=="Yes" | var2=="Yes" | var3=="Yes","Yes","No")

任何帮助将不胜感激。我已经更改了数据的名称并在示例中放置了三个变量。实际上总共有 22 个变量名称非常相似,我试图简化示例。如果查看实际数据/代码会有所帮助,我会添加它。

谢谢!

【问题讨论】:

  • 这可能是因为你有 NA 元素我是 'var's 之一

标签: r


【解决方案1】:

如果有任何 NA,== 将返回 NA。一个选项是cbind 变量'var1'、'var2'、'var3'(不清楚它是data.frame 列还是独立向量),与"Yes" 比较,创建一个逻辑矩阵,使用rowSums 获取“是”字符串的总和。请注意na.rm = TRUE,它将处理NA 元素(如果有)。使用行和,检查值是否大于0,则为“是”,否则为“否”

ifelse(rowSums(cbind(var1, var2, var3)== "Yes"), na.rm = TRUE) > 0, "Yes", "No")

检查它为什么产生NA

v1 <- c("Yes", "No", NA)
v2 <- c("No", NA, "Yes")

(v1 == "Yes")|(v2 == "Yes")
#[1] TRUE   NA TRUE

【讨论】:

  • 谢谢,这就是问题所在。我以为我已经处理了丢失的数据,但事实证明我没有。非常感谢您的帮助。
【解决方案2】:

在创建变量时尝试 complete.cases() 以省略 NA

df$new <- ifelse((var1 =="Yes"| var2=="Yes"|var3=="Yes")& complete.cases(df), "Yes", "No")


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-19
    • 2023-03-20
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多