【问题标题】:Use the previous value if condition is met in R while using ifelse()如果在使用 ifelse() 时在 R 中满足条件,则使用先前的值
【发布时间】:2018-07-31 15:24:30
【问题描述】:

我在将 if.. else 条件之一转换为 R 中的 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,我不知道它来自哪里

【问题讨论】:

    标签: r if-statement


    【解决方案1】:

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

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

    条件执行它在第一个条件中应该做的事情(用一个覆盖一个零)。在第二种情况下,我们有一个向量,所以如果 a 为零,就像它在最后一个值中一样,向量只会到达 a 中的同一点,因此你有一个零。由于您以零为条件,因此您会得到零。

    解决方案:

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

    我会创建相同的滞后向量并在最后填充一个 NA,所以:

    c(brv_trx1$decvar[-1],NA) instead of the lag(brv_trx1$decvar)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2020-01-01
      • 2021-02-09
      • 1970-01-01
      相关资源
      最近更新 更多