Решение без пакетов будет выглядеть так:
apply(df, 2, function(x) sum(x == ""))
Однако это может быть медленным, и вы можете воспользоваться некоторыми из библиотек.
Например, вот как выглядит решение dplyr
:
library(dplyr)
df %>%
summarise_all(funs(sum(. == "")))
Однако, если вы работаете с большими кадрами данных, вы, вероятно, выиграете от еще более быстрогоdata.table
:
library(data.table)
setDT(df)[, lapply(.SD, function(x) sum(x == ""))]
Но давайте не будем забывать, что может быть более гибкое и быстрое решение tidyverse
(по сравнению с dplyr
):
library(purrr)
map_int(df, function(x) sum(x == ""))
Кто победитВот?
Я провел быстрый тест для таблицы с 400 000 строк и 26 столбцов, и data.table
кажется самым быстрым в среднем (единица измерения - миллисекунды):
expr min lq mean median uq max neval
purrr 56.80567 58.76752 71.99501 64.61143 78.72492 199.9948 100
dplyr 70.65627 73.17036 85.56228 79.73072 93.51717 194.7238 100
base 689.97336 771.03395 830.39465 794.20452 881.38988 1116.8218 100
datatable 57.83673 60.17200 70.97264 64.60314 78.89446 165.2100 100
Однако, purrr
на самом деле не отстает, с другим пробегом он может также обогнать DT
.Если вы уже используете один или другой, все будет хорошо, просто придерживайтесь его.