Domanda
Ho un CSV di file di dati che posso caricare in R usando read.csv()
Mancano alcuni dati, quindi desidero ridurre il frame di dati verso il basso per impostare che consista interamente di dati non mancanti, ovvero se un NULL
appare ovunque, voglio escludere quella colonna e riga dal set di dati filtrati.
So che probabilmente posso farlo abbastanza semplicemente con le operazioni integrate di vettore R, ma non sono sicuro di come farlo esattamente?
Per rendere la mia domanda un po 'più concreta, ecco un rapido esempio dei dati in modo da poter vedere cosa voglio fare.
DocID Anno1 Anno7 Anno8
1 7 NULL 8
2 8 NULL 3
44 10 2 3
45 6 6 6
46 1 3 4
49 3 8 5
62 4 NULL 9
63 2 NULL 4
67 11 NULL 3
91 NULL 9 7
92 NULL 7 5
93 NULL 8 8
Quindi, dato questo input, ho bisogno di un po 'di codice che riduca l'output a questo.
DocID Anno8
44 3
45 6
46 4
49 5
Poiché Anno8
è l'unica colonna con dati non NULL e sono presenti solo quattro righe con dati non NULL.
Soluzione
Se x
è il tuo data.frame
(o matrice
) allora
x[ ,apply(x, 2, function(z) !any(is.na(z)))]
Poiché il tuo esempio usa NULL
, is.na (& # 183;)
sarà sostituito da is.null (& # 183;)
In alternativa puoi guardare il sottoinsieme (& # 183;)
.
Altri suggerimenti
Puoi eliminare qualsiasi riga contenente un file mancante utilizzando na.omit (), tuttavia non è quello che desideri. Inoltre, la risposta attualmente accettata è errata. Ti dà colonne complete, ma non elimina le righe che hanno uno o più valori mancanti, che è ciò che è stato richiesto. La risposta corretta può essere ottenuta come:
> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4))
> a
a b c
1 1 NA 3
2 2 1 4
> na.omit(a)[,colSums(is.na(a))==0]
a c
2 2 4
Per vedere che la risposta sopra è sbagliata:
> a[ ,apply(a, 2, function(z) !any(is.na(z)))]
a c
1 1 3
2 2 4
La riga 1 deve essere eliminata a causa della NA nella colonna 2.
a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1))
na.omit(a)
a b c
2 2 1 4
4 1 1 1
a[rowSums(is.na(a))==0,]
a b c
2 2 1 4
4 1 1 1
a[complete.cases(a),]
a b c
2 2 1 4
4 1 1 1
Inoltre, puoi farlo utilizzando la libreria sqldf
, se x
è il tuo frame di dati:
library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")