Использование is.na с функцией Sapply в R - PullRequest
0 голосов
/ 13 ноября 2018

Может кто-нибудь сказать мне, что делает строка кода, написанная ниже?

sapply(X, function(x) sum(is.na(x))) / nrow(airports) * 100

Понятно, что он упадет NA с, когда применяет функцию суммы, но сохраняет их в матрице.

Любая помощь приветствуется.

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

достаточно комментариев, время для ответа:

sapply(X,      # apply to each item of X (each column, if X is a data frame)
  function(x)  # this function:
    sum(is.na(x))  # count the NAs
) / nrow(airports) * 100  # then divide the result by the number of rows in the the airports object
  # and multiply by 100

Словом, он подсчитывает количество пропущенных значений в каждом столбце X, затем делит результат на количество строк в airports и умножает на 100. Вычисляет процент пропущенных значений в каждом столбце, предполагая, X имеет столько же строк, сколько и airports.

Странно смешивать и сопоставлять столбцы X с nrow(airports), я ожидаю, что они будут одинаковыми (то есть, либо sapply(airports, ...) / nrow(airports), либо sapply(X, ...) / nrow(X).

Как я уже упоминал в комментариях, ничего не "сбрасывается". Если вы хотите сделать sum, игнорируя значения NA, вы должны сделать sum(foo, na.rm = TRUE). Вместо этого здесь * то, что суммируется, равно is.na(x), то есть мы суммируем, пропущено или нет каждое значение: подсчет пропущенных значений. sum(is.na(foo)) - это идиоматический способ подсчета количества NA значений в foo.

В этом случае, когда целью является процент, а не количество, мы можем упростить, используя mean() вместо sum() / n:

# slightly simpler, consistent object
sapply(airports, function(x) mean(is.na(x))) * 100

Мы также можем использовать is.na() для всех данных, поэтому нам не нужна «анонимная функция»:

# rearrange for more simplicity
sapply(is.na(airports), mean) * 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...