Можно ли фильтровать data.frame для полных случаев с помощью dplyr? complete.cases
со списком всех переменных работает, конечно. Но это а) многословно, когда есть много переменных, и б) невозможно, когда имена переменных неизвестны (например, в функции, которая обрабатывает любой data.frame).
library(dplyr)
df = data.frame(
x1 = c(1,2,3,NA),
x2 = c(1,2,NA,5)
)
df %.%
filter(complete.cases(x1,x2))
complete.cases
не только принимает векторы. Также требуются целые фреймы данных.dplyr
функции фильтрации. Думаю, я не совсем понял и обновил свой вопрос.Ответы:
Попробуй это:
или это:
или это:
Если вы хотите выполнить фильтрацию на основе отсутствия одной переменной, используйте условное выражение:
или
Другие ответы показывают, что из вышеперечисленных решений
na.omit
намного медленнее, но это должно быть сбалансировано с тем фактом, что оно возвращает индексы строк пропущенных строк вna.action
атрибуте, тогда как другие решения выше этого не делают.ДОБАВЛЕНО Обновлены, чтобы отразить последнюю версию dplyr и комментарии.
ДОБАВЛЕНО Обновлены, чтобы отразить последнюю версию tidyr и комментарии.
источник
na.omit()
работает довольно плохо, но тот быстрый.df %>% filter(complete.cases(.))
. Не уверен, что недавние изменения в dplyr сделали это возможным.drop_na
, так что теперь вы можете сделать:df %>% drop_na()
.Это работает для меня:
Или немного более общий:
Это имело бы то преимущество, что данные могли быть изменены в цепочке перед передачей их фильтру.
Еще один тест с большим количеством столбцов:
источник
df %>% slice(which(complete.cases(.)))
примерно на 20% быстрее, чем подход с фильтрами в тесте выше.%>% data.frame() %>%
прежде чем пытаться фильтровать по complete.cases (.), Потому что он не будет работать на столы или сгруппированные плитки или что-то в этом роде. По крайней мере, у меня был такой опыт.Вот некоторые результаты тестов для ответа Гротендика. na.omit () занимает в 20 раз больше времени, чем два других решения. Я думаю, было бы неплохо, если бы в dplyr была функция для этого, возможно, как часть фильтра.
источник
Это короткая функция, которая позволяет вам указывать столбцы (в основном все, что
dplyr::select
можно понять), которые не должны иметь никаких значений NA (смоделированы после pandas df.dropna () ):[ drop_na теперь является частью tidyr : указанное выше можно заменить на
library("tidyr")
]Примеры:
источник
попробуй это
ИЛИ даже это
Приведенные выше команды позаботятся о проверке полноты для всех столбцов (переменных) в вашем data.frame.
источник
dplyr
как часть функции фильтра. Это позволит аккуратно интегрировать цепочки dplyr и т. Д.dplyr:::do.data.frame
заявленииenv$. <- .data
добавляет точку в окружение. Нет такого заявления в magrittr :: "%>%" `Просто для полноты картины
dplyr::filter
можно вообще избежать, но все же можно составлять цепочки, просто используяmagrittr:extract
(псевдоним[
):Дополнительный бонус скорости, это самый быстрый способ среди
filter
иna.omit
вариантов (тестировалось с помощью @Miha ТРОСТ microbenchmarks).источник
extract()
происходит почти в десять раз медленнее, чемfilter()
. Однако, когда я создаю меньший фрейм данных с помощьюdf <- df[1:100, 1:10]
, изображение меняется иextract()
становится самым быстрым.magrittr::extract
это самый быстрый способ толькоn <= 5e3
в тесте Miha Trošt.