достаточно комментариев, время для ответа:
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