É possível filtrar um data.frame para casos completos usando dplyr? complete.cases
com uma lista de todas as variáveis funciona, é claro. Mas isso é a) detalhado quando há muitas variáveis eb) impossível quando os nomes das variáveis não são conhecidos (por exemplo, em uma função que processa qualquer 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
não aceita apenas vetores. Leva quadros de dados inteiros também.dplyr
função de filtro de. Acho que não fui claro o suficiente e atualizei minha pergunta.Respostas:
Experimente isto:
ou isto:
ou isto:
Se você deseja filtrar com base na falta de uma variável, use uma condicional:
ou
Outras respostas indicam que uma das soluções acima
na.omit
é muito mais lenta, mas isso deve ser balanceado em relação ao fato de que retorna índices de linha das linhas omitidas nona.action
atributo, enquanto as outras soluções acima não.ADICIONADO Foi atualizado para refletir a versão mais recente do dplyr e comentários.
ADICIONADO Atualizei para refletir a versão mais recente do tidyr e comentários.
fonte
na.omit()
executa muito mal, mas aquele é rápido.df %>% filter(complete.cases(.))
. Não tenho certeza se mudanças recentes no dplyr tornaram isso possível.drop_na
, então agora você pode fazer:df %>% drop_na()
.Isso funciona para mim:
Ou um pouco mais geral:
Isso teria a vantagem de que os dados poderiam ser modificados na cadeia antes de passá-los para o filtro.
Outro benchmark com mais colunas:
fonte
df %>% slice(which(complete.cases(.)))
desempenho ~ 20% mais rápido do que a abordagem de filtro no benchmark acima.%>% data.frame() %>%
antes de tentar filtrar em complete.cases (.) Porque não funcionará em tibbles ou tibbles agrupados ou algo assim. Ou, pelo menos, foi essa a experiência que tive.Aqui estão alguns resultados de referência para a resposta de Grothendieck. na.omit () leva 20x mais tempo que as outras duas soluções. Acho que seria bom se o dplyr tivesse uma função para isso talvez como parte do filtro.
fonte
Esta é uma função curta que permite especificar colunas (basicamente tudo o que
dplyr::select
pode entender) que não deve ter nenhum valor NA (modelado após pandas df.dropna () ):[ drop_na agora faz parte do tidyr : o acima pode ser substituído por
library("tidyr")
]Exemplos:
fonte
tente isso
OU mesmo isso
Os comandos acima se encarregam de verificar a integridade de todas as colunas (variáveis) em seu data.frame.
fonte
dplyr
como parte da função de filtro. Isso permitiria uma integração perfeita em cadeias dplyr etc.dplyr:::do.data.frame
declaraçãoenv$. <- .data
adiciona um ponto ao meio ambiente. Essa declaração não existe em magrittr :: "%>%" `Apenas por uma questão de completude,
dplyr::filter
pode ser evitado completamente, mas ainda pode compor cadeias apenas usandomagrittr:extract
(um alias de[
):O bônus adicional é a velocidade, este é o método mais rápido entre as variantes
filter
ena.omit
(testado usando microbenchmarks @Miha Trošt).fonte
extract()
é quase dez vezes mais lento do que ofilter()
. No entanto, quando eu crio um quadro de dados menor comdf <- df[1:100, 1:10]
, a imagem muda eextract()
é mais rápida.magrittr::extract
é o caminho mais rápido apenasn <= 5e3
no benchmark Miha Trošt.