ifelse有多个输出

时间:2018-02-12 12:43:47

标签: r if-statement row

是否可以使用ifelse获得多个输出? 我想创建一个带有0或1的变量ExpectedVariable。 如果VariableA的值为0,那么我需要ExpectedVariable为当前行和前一行的0。如果VariableA的值为1,那么我需要ExpectedVariable为1。

我在考虑这样的事情(因为它不起作用):

 mydata$ExpectedVariable <- ifelse(mydata$VariableA == 0, (mydata$ExpectedVariable & lag(mydata$ExpectedVariable) <- 0), 1)

示例:

         VariableA    ExpectedVariable
row1     1            1
row2     1            1
row3     1            1
row4     1            1
row5     1            1
row6     1            0
row7     0            0
row8     1            1
row9     1            0
row10    0            0
row11    1            1
row12    1            1
row13    1            0
row14    0            0

2 个答案:

答案 0 :(得分:1)

您可以考虑问题的另一种方法是ExpectedVariable如果满足两个条件中的任何一个(VariableA的当前值为零)或引导,则等于零VariableA为零)。换句话说,不要考虑多个输出,而应考虑多个条件ifelse()可以轻松完成。然后我们可以通过任何类型的移位功能来实现这一点。

使用data.table::shift()

expected_df <- read.table(header = TRUE, text = "
         VariableA    ExpectedVariable
row1     1            1
row2     1            1
row3     1            1
row4     1            1
row5     1            1
row6     1            0
row7     0            0
row8     1            1
row9     1            0
row10    0            0
row11    1            1
row12    1            1
row13    1            0
row14    0            0")

rownames(expected_df) <- NULL

mydata <- data.frame(VariableA = expected_df$VariableA)
mydata$ExpectedVariable <- ifelse(mydata$VariableA == 0
                                  | data.table::shift(mydata$VariableA,
                                                      type = 'lead') == 0,
                                  0, 1)
all.equal(mydata, expected_df)

[1] TRUE

使用dplyr::lead()

mydata$ExpectedVariable <- ifelse(mydata$VariableA == 0
                                  | dplyr::lead(mydata$VariableA) == 0,
                                  0, 1)

all.equal(mydata, expected_df)

[1] TRUE

答案 1 :(得分:0)

应该做的诀窍:

df$expectedVariable[df$VariableA == 1] <- 1
df$expectedVariable[df$VariableA == 0] <- 0
df$expectedVariable[which(df$VariableA == 0) - 1] <- 0

或者将最后两行放在一个:

df$expectedVariable[c(which(df$VariableA == 0), which(df$VariableA == 0) - 1)] <- 0