min(x,y)== NA具有NA值的For循环

时间:2015-05-21 14:18:03

标签: r for-loop min na

我想选择最小值并将其返回为"最低值为:XX"。 但是当我有NA值时,我很难做到这一点。

x <- c(21,32,123,NA,4,45,65,23)
y <- c(234,2,12,54,87,12,4,123)
myDF<- as.data.frame(cbind(x, y))

for(i in 1:length(myDF$x)) {
  if (min(myDF$x[i], myDF$y[i], na.rm = TRUE) == myDF$x[i]) { cat("The lowest number is: ", myDF$x[i], "\n")}
  else if (min(myDF$x[i], myDF$y[i], na.rm=TRUE) == myDF$y[i]) { cat("The lowest number is: ", myDF$y[i], "\n")}
}

在我获得NA值之前一切正常。我的问题是,当我到达i = 4时,我得到了:

min(NA, 54) == NA  

我希望这返回&#34;最低的数字是:54&#34;。但相反,我的循环中断并给我这个消息。

The lowest number is:  21 
The lowest number is:  2 
The lowest number is:  12 
Error in if (min(myDF$x[i], myDF$y[i], na.rm = TRUE) == myDF$x[i]) { : 
missing value where TRUE/FALSE needed

这似乎是问题所在?

1 个答案:

答案 0 :(得分:2)

问题是if表达式右侧或左侧部分可以获得NA。您无法将所有内容与NA进行比较,因此例如if(NA == 6) {...}会准确地为您提供所描述的错误。因此,在使用myDF$x[i]进行比较之前,请确保myDF$y[i]NA不是!is.na(value)

在您的示例中,由于rm.na = T,您实际上并不需要命令中的if-expression。我像这样重建你的代码:

x <- c(21,32,123,NA,4,45,65,23)
y <- c(234,2,12,54,87,12,4,123)
myDF<- as.data.frame(cbind(x, y))

for(i in 1:length(myDF$x)) {
  cat("The lowest value is: ", min(myDF$x[i], myDF$y[i], na.rm = T), "\n")
}

它返回

The lowest value is:  21 
The lowest value is:  2 
The lowest value is:  12 
The lowest value is:  54 
The lowest value is:  4 
The lowest value is:  12 
The lowest value is:  4 
The lowest value is:  23 

这应该是您的预期输出。