min ( x , y ) == NA 具有 NA 值的 For 循环
min(x, y) == NA For-loop with NA Values
我想选择最小值 return 作为 "The lowest value is: 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
我想 return "The lowest number is: 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
。
但是在您的示例中,您实际上不需要命令中的 if 表达式,因为 rm.na = T
。我像这样重建你的代码:
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")
}
它returns
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
这应该是您的预期输出。
我想选择最小值 return 作为 "The lowest value is: 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
我想 return "The lowest number is: 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
。
但是在您的示例中,您实际上不需要命令中的 if 表达式,因为 rm.na = T
。我像这样重建你的代码:
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")
}
它returns
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
这应该是您的预期输出。