如果使用ifelse()时R中满足条件,则使用先前的值

时间:2018-07-31 15:24:31

标签: r if-statement

我在将R中的if .. else条件之一转换为ifelse()时遇到了一个问题,以使过程更快。在此问题中,如果满足条件,则必须使用上一行的值。我无法从代码中复制相同的结果以下是if .. else语句及其转换后的代码。

for (i in 1:nrow(newdata)){


    if ((newdata$first == 1)){
      newdata[, decvar][i] = groups + 1 - ceiling(round((newdata$cum/total) * groups, 4))
    } #calculate decile; if var = 0, decile = 0
    else if (newdata$first == 0){
      newdata[, decvar][i] = newdata[, decvar][i-1]
    }
  }

使用ifelse():

brv_trx1$decvar <- ifelse(((brv_trx1$first == 1)),(11 - ceiling(round((brv_trx1$cum/total) * 10, 4))),
                          ifelse(((brv_trx1$first == 0)), lag(brv_trx1$decvar) ,NA))

示例输出将如下所示:

variable   First  Decvar 

45          1      10

42          1      10

31          1       9

30          0       9

30          0       9

29          0       8

29          0       8

28          0       8

21          1       7

我得到的输出为0,我不知道它来自哪里

1 个答案:

答案 0 :(得分:0)

我认为这里的问题可能出在brv_trx1上,您有一个滞后向量作为输出,请参见此处:

=F41/(SUMPRODUCT($G$18:$G$38,$X$18:$X$38)/($X$18:$X$38))>0.95
=F41/(SUMPRODUCT($G$18:$G$38,$X$18:$X$38)/($X$18:$X$38))>=0.9
=F41/(SUMPRODUCT($G$18:$G$38,$X$18:$X$38)/($X$18:$X$38))<0.9

该条件将执行第一个条件中的预期操作(用一个1覆盖一个零)。在第二种情况下,我们有一个向量,因此,如果a为零,就像在最后一个值中一样,向量恰好到达a中的同一点,因此您有一个零。由于您的条件是零,所以您会得到零。

解决方案:

a<-c(0,1,0)
> ifelse(a==0,1,0)
[1] 1 0 1
> ifelse(a==0,a,0)
[1] 0 0 0

我将创建相同的滞后向量,并在最后填充一个NA,因此:

ifelse(a==0,c(2,1,2),0)
[1] 2 0 2