从简单的for循环获取逻辑

时间:2019-02-19 08:56:48

标签: r for-loop na

我对使用循环有点陌生,所以请保持友善。

所以我有以下几行代码:

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

3 个答案:

答案 0 :(得分:3)

您需要在循环中打印

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

答案 1 :(得分:2)

不建议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

使用isTRUE

的OP方法
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 

答案 2 :(得分:1)

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