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?

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.


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))

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), ]

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).


3

Tente mudar isso:

new_DF<-dplyr::filter(DF,is.na(Var2)) 

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)),]

@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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.