在Ifelse语句中忽略NA - R

时间:2014-05-22 10:29:27

标签: r if-statement na

我有以下ifelse陈述。

ww.LIG = ifelse( (Accel2$wk.VWD >= 3 & Accel2$we.VWD >= 0 ) 
             | ( Accel2$wk.VWD >=2 & Accel2$we.VWD >=1 ) 
             | ( Accel2$wk.VWD >=1 & Accel2$we.VWD >=2) , 
             (Accel2$wk.LIG + Accel2$we.LIG)/2, NA)

如果满足上述条件,最后一行取两个变量的平均值。对于满足第一行中的第一个标准的数据(Accel2 $ wk.VWD> = 3& Accel2 $ we.VWD> = 0),对于名为Accel2 $ we.VWD的变量存在NA,这显然会返回尝试进行计算时使用NAN。

从这个论点中删除NA的简单方法是什么?

非常感谢。

3 个答案:

答案 0 :(得分:1)

你可以用我认为的两种方式来解决这个问题:

1)在此之前检查NAs的另一个问题 - 如:

ww.LIG = ifelse( is.na(Accel2$wk.VWD) | is.na(Accel2$we.VWD), NA,
             ifelse( (Accel2$wk.VWD >= 3 & Accel2$we.VWD >= 0 ) 
                 | ( Accel2$wk.VWD >=2 & Accel2$we.VWD >=1 ) 
                 | ( Accel2$wk.VWD >=1 & Accel2$we.VWD >=2) , 
                 (Accel2$wk.LIG + Accel2$we.LIG)/2, NA))

2)删除NA行开头 - 例如:

df = complete.cases(data.frame(wkVWD = Accel2$wk.VWD, weVWD = Accel2$we.VWD, Accel2$wk.LIG, weLIG = Accel2$we.LIG))
df$wwLIG = ifelse( (df$wkVWD >= 3 & df$weVWD >= 0 ) 
         | ( df$wkVWD >=2 & df$weVWD >=1 ) 
         | ( df$wkVWD >=1 & df$weVWD >=2) , 
         (df$wkLIG + df$weLIG)/2, NA)

这对你有用吗?

答案 1 :(得分:0)

您的问题定义不明确:以下比较的结果应该是什么?NA> = value,true或false?首先定义它。

我会考虑条件中的NA意味着条件不满足(a + b的总和只是一个优化,它也可以是两个独立的条件:

a = Accel2$wk.VWD
b = Accel2$we.VWD

ww.LIG = ifelse(!is.na(a + b) & 
                ((a >= 3 & b >= 0) | (a >= 2 & b >= 1) | (a >= 1 & b >= 2)), 
                (Accel2$wk.LIG + Accel2$we.LIG)/2, NA)

答案 2 :(得分:-1)

你可能会以艰难的方式解决这个问题。如果没有您的数据样本,我无法确定,但我认为您可以直接替换您的"平均值"

mean(c(Accel2$wk.LIG , Accel2$we.LIG), na.rm=TRUE)

目前尚不清楚是否要保留包含NA值的输入。