从简单的 for 循环中获取逻辑

Getting logicals from a simple for loop

我对使用循环有点陌生,所以请多关照。

所以我有这些代码行:

isTRUE(is.na(METEO_Data[,2]))
isTRUE(is.na(METEO_Data[,3]))
isTRUE(is.na(METEO_Data[,4]))
isTRUE(is.na(METEO_Data[,5]))
isTRUE(is.na(METEO_Data[,6]))
isTRUE(is.na(METEO_Data[,7]))
isTRUE(is.na(METEO_Data[,8]))
isTRUE(is.na(METEO_Data[,9]))

我只是在检查我的数据框中是否有任何 NA。

我的输出:

> isTRUE(is.na(METEO_Data[,2]))
[1] FALSE
> isTRUE(is.na(METEO_Data[,3]))
[1] FALSE
> isTRUE(is.na(METEO_Data[,4]))
[1] FALSE
> isTRUE(is.na(METEO_Data[,5]))
[1] FALSE
> isTRUE(is.na(METEO_Data[,6]))
[1] FALSE
> isTRUE(is.na(METEO_Data[,7]))
[1] FALSE
> isTRUE(is.na(METEO_Data[,8]))
[1] FALSE
> isTRUE(is.na(METEO_Data[,9]))
[1] FALSE

为什么这不起作用:

for (i in 2:9) {
 isTRUE(is.na(METEO_Data[,i]))
}

print(i)

输出:

> for (i in 2:9) {
+      isTRUE(is.na(METEO_Data[,i]))
+    }
> print(i)
[1] 9

需要在循环内打印

print(isTRUE(is.na(METEO_Data[,i])))

当您打印 i 时,您正在打印迭代次数。 如果要检查所有数据框的 NA,只需使用 is.na(df).

OP 试图检查他的数据中是否有任何 NA 的方式是不推荐的。

示例数据

(dat <- data.frame(col1 = c(1, NA, NA, 2),
                   col2 = 3))
#  col1 col2
#1    1    3
#2   NA    3
#3   NA    3
#4    2    3

OP 的方法使用 isTRUE

for (i in 1:2) {
  print(isTRUE(is.na(dat[,i])))
}
# [1] FALSE
# [1] FALSE

您可以使用 anyNA 代替 isTRUE,也可以使用 sapply 代替 for 循环,但这取决于您

sapply(dat, anyNA)
# col1  col2 
# TRUE FALSE

感谢@Gregor!

如果您需要每列的 NA 个数,您可以尝试

sapply(dat, function(x) sum(is.na(x)))
# col1 col2
#    2    0

或更高效

colSums(is.na(dat))
#col1 col2 
#   2    0