У меня возникли проблемы с кадром данных и не может реально решить эту проблему сам: dataframe имеет произвольные свойства, столбцов и каждая строка представляет собой один набор данных .
Вопрос в том,
как избавиться от столбцов, где для ВСЕХ строк значение равно NA ?
Два подхода, предложенных до сих пор, терпят неудачу с большими наборами данных, которые (среди прочих проблем с памятью) они создают
is.na(df)
, что будет объектом того же размера, что иdf
.Вот два подхода, которые более эффективны при использовании памяти и времени
Подход, использующий
Filter
и подход с использованием data.table (для общей эффективности использования времени и памяти)
примеры использования больших данных (30 столбцов, 1e6 строк)
источник
data.frame
, хотя. Здесь нет ничего, что действительно нужноdata.table
. Ключ - это тоlapply
, что позволяет избежать копирования всего объектаis.na(df)
. +10 за указание на это.bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
послеfunction(x)
- спасибо за пример, кстатиdplyr
теперь естьselect_if
глагол, который может быть полезен здесь:источник
dplyr
решения. Не был разочарован. Спасибо!Другим способом было бы использовать
apply()
функцию.Если у вас есть data.frame
тогда вы можете использовать,
apply()
чтобы увидеть, какие столбцы соответствуют вашему условию, и вы можете просто выполнить то же подмножество, что и в ответе Мусы, только сapply
подходом.источник
Поздно к игре, но вы также можете использовать
janitor
пакет. Эта функция удалит все столбцы, которые являются NA, и может быть изменена для удаления строк, которые также являются NA.df <- janitor::remove_empty(df, which = "cols")
источник
источник
Принятый ответ не работает с нечисловыми столбцами. Из этого ответа следующее работает со столбцами, содержащими разные типы данных
источник
Другие варианты с
purrr
пакетом:источник
Я надеюсь, что это также может помочь. Это может быть сделано в одну команду, но мне было легче читать, разделив его на две команды. Я сделал функцию со следующей инструкцией и работал молниеносно.
naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }
При желании .SD позволит ограничить проверку частью таблицы, но при этом вся таблица будет считаться
источник
Удобный
base R
вариант может бытьcolMeans()
:источник
Вы можете использовать пакет Дворник
remove_empty
Кроме того, еще один подход dplyr
ИЛИ
это также полезно, если вы хотите исключить / сохранить столбец с определенным количеством пропущенных значений, например
источник