我在将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,我不知道它来自哪里
答案 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