r语言 - min(x, y) == NA For-loop with NA Values



我想选择最小值并将其返回为"最小值是: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  

我想让它返回"最小的数字是:54"。但是我的循环中断了,给了我这个消息

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

有什么问题吗?

问题是if表达式,其中右侧或左侧部分可以得到NA。你不能将任何东西与NA进行比较,所以例如if(NA == 6) {...}会给你所描述的错误。因此,在使用!is.na(value)进行比较之前,请确保myDF$x[i]myDF$y[i]不是NA,如果您必须使用它。

在您的示例中,由于rm.na = T,您实际上不需要在命令中使用if-表达式。我像这样重新构建你的代码:
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 

这应该是您期望的输出

最新更新