Получение логики из простого цикла for - PullRequest
0 голосов
/ 19 февраля 2019

Я новичок в работе с циклами, поэтому будьте добры.

Итак, у меня есть следующие строки кода:

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 голосов
/ 19 февраля 2019

вы печатаете номер итерации при печати i.Если вы хотите проверить NA для всех ваших данных, просто используйте is.na(df).

0 голосов
/ 19 февраля 2019

Способ, которым OP пытается проверить, есть ли в его данных NA s, не рекомендуется.

Пример данных

(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 
0 голосов
/ 19 февраля 2019

Вам нужно печатать в цикле

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