Subconjunto de linhas contendo valores NA (ausentes) em uma coluna escolhida de um quadro de dados

96

Temos um quadro de dados de um arquivo CSV. O quadro de dados DFpossui colunas que contêm valores observados e uma coluna ( VaR2) que contém a data em que uma medição foi realizada. Se a data não foi registrada, o arquivo CSV contém o valor NA, para dados ausentes.

Var1  Var2 
10   2010/01/01
20   NA
30   2010/03/01

Gostaríamos de usar o comando subset para definir um novo quadro de dados de new_DFforma que contenha apenas linhas que tenham um NA'valor da coluna ( VaR2). No exemplo dado, apenas a linha 2 estará contida na nova DF.

O comando

new_DF<-subset(DF,DF$Var2=="NA") 

não funcionar, o quadro de dados resultante não tem entradas de linha.

Se no arquivo CSV original Valor NAsão trocados com NULLo mesmo comando produz o resultado desejado: new_DF<-subset(DF,DF$Var2=="NULL").

Como posso fazer esse método funcionar, se para a sequência de caracteres o valor NAé fornecido no arquivo CSV original?

John
fonte

Respostas:

145

Nunca use == 'NA' para testar os valores ausentes. Use em seu is.na()lugar. Isso deve servir:

new_DF <- DF[rowSums(is.na(DF)) > 0,]

ou caso queira verificar uma coluna específica, você também pode usar

new_DF <- DF[is.na(DF$Var),]

No caso de você ter valores de caracteres NA, primeiro execute

Df[Df=='NA'] <- NA

para substituí-los por valores ausentes.

Joris Meys
fonte
2
Obrigado pela sua resposta rápida (esta foi rápida)! Na verdade, devido à entrega csv dos dados, os 'NA' são valores de caracteres e sua segunda instrução pode ser muito útil. Você também pode esclarecer sua primeira declaração? O uso de rowSums () não é claro para mim, já que verificarei apenas uma coluna específica (há muitas colunas). Se essa coluna em particular (no exemplo seria a coluna Var2) tem uma string de caracteres 'NA' (vou substituí-la pela sua segunda declaração), então eu gostaria de escolher a linha inteira para fazer parte do novo quadro de dados .
João
@John: atualizado. O ponto é usar is.na, interpretei incorretamente que você queria verificar todas as variáveis.
Joris Meys
3
deve ser new_DF <- DF[is.na(DF$Var),], ou seja, parece haver um (colchete extra depois DF[?
PatrickT
39

NA é um valor especial em R, não misture o valor NA com a string "NA". Dependendo da forma como os dados foram importados, suas células "NA" e "NULL" podem ser de vários tipos (o comportamento padrão é converter strings "NA" em valores NA e deixar as strings "NULL" como estão).

Se estiver usando read.table () ou read.csv (), você deve considerar o argumento "na.strings" para fazer a importação de dados limpa e sempre trabalhar com valores R NA reais.

Um exemplo, trabalhando em ambos os casos células "NULL" e "NA":

DF <- read.csv("file.csv", na.strings=c("NA", "NULL"))
new_DF <- subset(DF, is.na(DF$Var2))
maressyl
fonte
1
Obrigado pela sua resposta. Se bem entendi, a primeira declaração faria o mesmo que Df [Df == 'NA'] <- NA no exemplo de Joris? A (pequena) diferença seria que isso é feito em sua instrução diretamente no início, quando o quadro de dados é criado (este é um método de programação muito limpo e, portanto, gosto dele).
João
Exatamente. Joris sugeriu substituir as strings "NA" por valores NA manualmente, aqui eu apenas sugiro usar o recurso "na.strings" de read.table () para atingir o mesmo propósito.
maressyl
A resposta de Joris é na verdade a maneira "preferida" de realizar esse feito (se você estiver escrevendo em um script). Consulte: stackoverflow.com/questions/9860090/…
Jonathan
@ Jonathan: Duas ideias distintas aqui, o tópico que você cita diz "[" deve ser preferido em "subconjunto", mas estávamos falando sobre o argumento "na.strings" em read.table (), meu subconjunto estava aqui apenas para visualizar os efeitos.
maressyl 01 de
32

complete.casesTRUEquando todos os valores em uma linha não sãoNA

DF[!complete.cases(DF), ]
user3226167
fonte
11
new_data <- data %>% filter_all(any_vars(is.na(.))) 

Isso deve criar um novo quadro de dados (new_data ) com apenas os valores ausentes nele.

Funciona melhor para manter um controle dos valores que você pode descartar mais tarde, porque eles tinham algumas colunas com observações ausentes (NA).

Ronak Pol
fonte
3

Tente mudar isso:

new_DF<-dplyr::filter(DF,is.na(Var2)) 
drhnis
fonte
Você poderia explicar por que isso funciona, o que isso faz, etc.?
csilk
new_DF <-dplyr :: filter (DF, is.na (Var2)) basicamente usa a função de filtro do pacote dplyr e filtra qualquer observação na coluna Var2 que satisfaça a condição is.na, ou seja, eles selecionam todas as observações com NA
drhnis
1
Mais bem expresso DF %>% filter(is.na(Var2))depois library(dplyr).
Joe
-1

Imprime todas as linhas com dados NA:

tmp <- data.frame(c(1,2,3),c(4,NA,5));
tmp[round(which(is.na(tmp))/ncol(tmp)),]
jstar
fonte
@ZheyuanLi Se você não gostar da resposta, simplesmente vote contra ela. Editar a resposta para recomendar sinalização NÃO é a ação apropriada. Deixe um comentário se sentir necessidade.
Manfred Radlwimmer