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.

È stato utile?

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")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top