我的' if-else'挡错了?

时间:2015-06-26 04:51:16

标签: r

我有一个包含以下数据的数据框java.lang.IllegalArgumentException org.springframework.asm.ClassReader.(Unknown Source) org.springframework.asm.ClassReader.(Unknown Source) org.springframework.asm.ClassReader.(Unknown Source) 文件:

df

我试图添加两个新列并填写“是”' /'否'具有缺失值的记录的值。我的预期输出是:

ID      P1  P2  Year    Month     A      B
11084   23  43  2001    April     41.9  -99.99
67985   76  12  2001    May       6.9   -9.99
11084   34  64  2001    June      -999  -99.99
34084   56  77  2001    July      NA    -99.99
11043   90  54  2001    August    NA    -99.99
23084   55  32  2001    September 50.8  -99.99
11084   77  14  2001    October   0     -99.99
54328   89  56  2001    November  -999  -99.99

我是R.的新手。我试图通过以下方式使用简单的ID P1 P2 Year Month A B A_miss B_miss 11084 23 43 2001 April 41.9 -99.99 No Yes 67985 76 12 2001 May 6.9 123 No No 11084 34 64 2001 June -999 -99.99 Yes Yes 34084 56 77 2001 July NA -99.99 Yes Yes 11043 90 54 2001 August NA -99.99 Yes Yes 23084 55 32 2001 September 50.8 -99.99 No Yes 11084 77 14 2001 October 0 -99.99 No Yes 54328 89 56 2001 November -999 -99.99 Yes Yes 循环和for条件来实现此目的:

if/else

我是第一次在A&#39; A&#39;列,但每次我尝试时只有for(i in length(df$A)) { if(df$A[i] == -999 || df$A[i] == 'NA') df$A_miss[i] <- 'Yes' else df$A_miss[i] <- 'No' } 部分正在执行,并且没有&#39; No&#39;价值正在整个&#39; A_miss&#39;柱。我无法找出else部分无法正常工作的原因。

我哪里错了?

4 个答案:

答案 0 :(得分:3)

您的循环未正确定义。这个有效:

for (i in 1:length(df$A)) {
    if(df$A[i] == -999 || is.na(df$A[i]) )
        df$A_miss[i] <- 'Yes'

    else  
        df$A_miss[i] <- 'No'
}

限制应设为(i in 1:length(df$A)),而不是(i in length(df$A)。希望这会有所帮助。

PS:正如您所看到的,@ Pascal指出的重要修正已在此处实施。

PPS:下面的版本应该比使用for循环的代码快得多:

df$A_miss <- 'No'
df$A_miss[which(df$A==-999 | is.na(df$A)] <- 'Yes'

(我刚注意到这个解决方案与@Daniel Fischer先前提出的解决方案非常相似)

答案 1 :(得分:2)

矢量化版本:

var a: Boolean = _;
def someFunction: Boolean = true
while({ a = someFunction; a }) {
    println("hi " + a)
}

答案 2 :(得分:0)

也许你可以试试这个,没有任何循环或if子句:

    df$A[(df$A==-999)|(is.na(df$A))] <- "yes"
    df$A[df$A!="yes"] <- "no"

答案 3 :(得分:0)

使用which命令可能会提高进程的速度:

df$A_miss[which(df$A==-999 | is.na(df$A))] <- 'Yes'
df$A_miss[which(df$A_miss!='Yes')] <- 'no'