Estou tendo problemas com um quadro de dados e realmente não consegui resolver esse problema:
o quadro de dados tem propriedades arbitrárias como colunas e cada linha representa um conjunto de dados .
A questão é:
como se livrar de colunas onde, para TODAS as linhas, o valor é NA ?
As duas abordagens oferecidas até agora falham com grandes conjuntos de dados, pois (entre outros problemas de memória) eles criam
is.na(df)
, que serão um objeto do mesmo tamanho quedf
.Aqui estão duas abordagens que são mais eficientes em termos de memória e tempo
Uma abordagem usando
Filter
e uma abordagem usando data.table (para eficiência geral de tempo e memória)
exemplos usando dados grandes (30 colunas, 1e6 linhas)
fonte
data.frame
, no entanto. Não há nada aqui que realmente precisedata.table
. A chave é alapply
, que evita a cópia de todo o objeto feito poris.na(df)
. +10 por apontar isso.bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
depoisfunction(x)
- graças para o exemplo btwdplyr
agora tem umselect_if
verbo que pode ser útil aqui:fonte
dplyr
solução. Não fiquei desapontado. Obrigado!Outra maneira seria usar a
apply()
funçãoSe você tiver o data.frame
então você pode usar
apply()
para ver quais colunas atendem à sua condição e, portanto, pode simplesmente fazer o mesmo subconjunto da resposta de Musa, apenas com umaapply
abordagem.fonte
Tarde para o jogo, mas você também pode usar o
janitor
pacote. Esta função removerá as colunas que são todas NA e pode ser alterada para remover as linhas que também são NA.df <- janitor::remove_empty(df, which = "cols")
fonte
fonte
A resposta aceita não funciona com colunas não numéricas. A partir desta resposta , o seguinte funciona com colunas contendo diferentes tipos de dados
fonte
Outras opções com o
purrr
pacote:fonte
Espero que isso também ajude. Poderia ser transformado em um único comando, mas achei mais fácil ler dividindo-o em dois comandos. Fiz uma função com as seguintes instruções e trabalhei muito rápido.
naColsRemoval = function (DataTable) { na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )] DataTable [ , unlist (na.cols) := NULL , with = F] }
.SD permitirá limitar a verificação a parte da tabela, se você desejar, mas tomará a tabela inteira como
fonte
Uma
base R
opção útil pode sercolMeans()
:fonte
Você pode usar o pacote Janitor
remove_empty
Além disso, outra abordagem dplyr
OU
isso também é útil se você deseja excluir / manter apenas a coluna com um certo número de valores ausentes, por exemplo
fonte