如何正确地在R中编写这个ifelse语句

时间:2014-04-24 13:07:34

标签: r if-statement

我想在列中返回一个值,或NA,取决于其他列中的值。

我基本上想看看列中的值是否符合第一个测试标准:

df$v2.1 >= df$varx & df$v3.1 <6

如果没有,它会遇到第二个:

 df$v4.1 >= df$vary & df$v5.1 >5

然后如果两者都没有返回NA

我试过的代码如下。

df$v1.1 = ifelse(df$v2.1 >= df$varx & df$v3.1 <6 || df$v4.1 >= df$vary & df$v5.1 >5 ,df$v1.1, NA)

2 个答案:

答案 0 :(得分:2)

您唯一的错误是使用||而不是|||没有矢量化,只考虑第一个元素。所有其他运算符(和ifelse())都是矢量化的,因此以下内容应按预期工作:

df$v1.1 = ifelse(df$v2.1 >= df$varx & df$v3.1 <6 | df$v4.1 >= df$vary & df$v5.1 > 5, df$v1.1, NA)

检查您何时执行相当复杂或多个逻辑操作的好方法是运行每个操作,看看您是否获得了预期的输出。如果您运行:

df$v2.1 >= df$varx & df$v3.1 <6

df$v4.1 >= df$vary & df$v5.1 > 5

你应该得到一个逻辑值向量。如果您运行:

df$v2.1 >= df$varx & df$v3.1 <6 || df$v4.1 >= df$vary & df$v5.1 > 5

你应该得到一个逻辑值。在您的情况下,这将从ifelse()提供一个结果,然后将其回收以填充df$v1.1

答案 1 :(得分:1)

据我所知,df $ v1.1已经定义,因此您只需修改ifelse中未通过测试的那些行。以下可能更容易:

 df$v1.1[
   which(
     !(df$v2.1 >= df$varx & df$v3.1 <6) & !(df$v4.1 >= df$vary & df$v5.1 >5))
   ] <- NA