当选项之一产生NA时在R中使用ifelse?

时间:2019-07-01 15:21:32

标签: r function if-statement

我想向量化一个依赖于检查条件的函数,并根据该条件是TRUE还是FALSE,分别返回两个函数之一的结果。问题在于,当条件为FALSE时,无法评估第一个函数。然后,ifelse返回正确的值,但也会产生警告。我想产生一个不会产生警告的函数。

我已经尝试过ifelse(),但是它不起作用。我期望当条件为FALSE时,此命令将跳过对第一个函数的求值。

这是R代码的说明部分

p = c(-1,1,-1,1,-1,-1,-1,1)

ifelse(p>0, sqrt(p), p^2)

返回

[1] 1 1 1 1 1 1 1 1
Warning message:
In sqrt(p) : NaNs produced

如您所见,结果是正确的,但是由于某种原因,当条件为FALSE时,它将在第一个函数处评估该函数。因此,我想以某种方式避免这个问题。

2 个答案:

答案 0 :(得分:3)

可能无法通过ifelse进行回避。我对ifelse流程的理解是

  1. 基于yes中的表达式创建值的向量
  2. 基于no中的表达式创建值的向量
  3. 使用test的结果来确定每个元素是来自yes还是no

如果yesno中发生错误,则ifelse将失败。

要解决此问题,您只需评估表达式将成功的位置。 (例如akrun的答案,为完整起见,此处给出了其变体)

p = c(-1,1,-1,1,-1,-1,-1,1)

condition <- p > 0

result <- numeric(length(p))

result[g1] <- sqrt(p[condition])
result[!g1] <- p[condition]^2

答案 1 :(得分:2)

我们可以创建一个numeric向量,然后根据'p'提出的条件填充元素

out <- numeric(length(p))
out[p > 0] <- sqrt(p[p > 0])
out[p <= 0] <- p[p <= 0]^2

对于ifelse,我们需要具有相同length的所有参数。根据{{​​1}}

  

ifelse(测试,是,否)

     

具有相同长度和属性(包括尺寸和   “ class”)作为测试值和来自yes或no值的数据值

发生的事情是我们对整个向量都进行了计算,并根据?ifelse条件替换了'p'的值。对于test,负值肯定会发出警告,并输出为sqrt。尽管NaN元素未显示在输出中,但警告已被打印。该警告是一种友好的警告,但可以使用NaN

取消显示。