R中的Ifelse语句有多个条件

时间:2016-04-01 17:40:32

标签: r if-statement

通过以下示例数据,我试图创建一个新变量" Den" (值" 0"或" 1")基于三个条件变量(Denial1,Denial2和Denial3)的值。

我想要一个" 0"如果三个条件变量中的任何一个具有" 0"和" 1"只有当其中包含值的每个条件变量的值为" 1" (例如,不是NA)。

structure(list(Denial1 = NA_real_, Denial2 = 1, Denial3 = NA_real_, 
Den = NA), .Names = c("Denial1", "Denial2", "Denial3", "Den"
), row.names = 1L, class = "data.frame")

我已经尝试了以下两个命令,导致缺少值NA#34; Den":

DF$Den<-ifelse (DF$Denial1 < 1 | DF$Denial2 < 1 | DF$Denial3 < 1, "0", "1")

DF$Den<-ifelse(DF$Denial1 < 1,"0", ifelse (DF$Denial2 < 1,"0", ifelse(DF$Denial3 < 1,"0", "1")))

有人可以演示如何做到这一点吗?

5 个答案:

答案 0 :(得分:10)

根据@jaimedash和@Old_Mortality的建议,我找到了一个解决方案:

DF$Den <- ifelse(DF$Denial1 < 1 & !is.na(DF$Denial1) | DF$Denial2 < 1 &  
!is.na(DF$Denial2) | DF$Denial3 < 1 & !is.na(DF$Denial3), "0", "1")

然后,如果条件变量的所有值都是NA,则确保NA的值:

DF$Den <- ifelse(is.na(DF$Denial1) & is.na(DF$Denial2) & is.na(DF$Denial3), 
NA, DF$Den)

答案 1 :(得分:3)

怎么样?

DF$Den<-ifelse (is.na(DF$Denial1) | is.na(DF$Denial2) | is.na(DF$Denial3), "0", "1")

答案 2 :(得分:3)

有一个更简单的解决方案。您所描述的是&运算符的自然行为,因此可以首先完成:

> c(1,1,NA) & c(1,0,NA) & c(1,NA,NA)
[1]  TRUE FALSE    NA

如果all均为1,则返回1。如果any为0,则为0.如果全部为NA,则为NA。

在您的情况下,代码将是:

DF$Den<-DF$Denial1 & DF$Denial2 & DF$Denial3

为了实现此目的,您需要停止使用character并使用numericlogical类型。

答案 3 :(得分:2)

非常简单地使用onNext()

any

答案 4 :(得分:0)

使用dplyr的另一种解决方案是:

df <- ## your data ##
df <- df %>%
        mutate(Den = ifelse(any(is.na(Den)) | any(Den != 1), 0, 1))