Frage

Ich habe eine CSV-Datei von Daten, die ich in R mit read.csv() laden

Einige der Daten fehlen, so möge ich Sie den Datenrahmen reduzieren einzustellen, dass ausschließlich aus nicht-fehlenden Daten besteht, dh wenn ein NULL überall erscheint, möchte ich diese Spalte auszuschließen und aus dem gefilterten Datensatz Zeile .

Ich weiß, dass ich dies wahrscheinlich ziemlich einfach mit den eingebauten R Vektoroperationen tun, aber ich bin mir nicht ganz sicher, wie dies genau das zu tun?

Auf meine Frage etwas konkreter, hier ist eine kurze Probe der Daten zu machen, so können Sie sehen, was ich tun möchte.

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

So gegeben dieser Eingang, ich brauche einige Code, der die Ausgabe auf diese reduzieren.

DocID       Anno8
44          3
45          6
46          4
49          5

Wie Anno8 ist die einzige Spalte mit nicht-NULL-Daten, und es gibt nur vier Zeilen mit nicht-NULL-Daten.

War es hilfreich?

Lösung

Wenn x Ihr data.frame (oder matrix) dann

x[ ,apply(x, 2, function(z) !any(is.na(z)))]

Da Ihr Beispiel NULL verwendet, wird is.na(·) durch is.null(·) ersetzt werden

Alternativ können Sie sich subset(·) suchen.

Andere Tipps

Sie können jede Zeile fallen eine fehlende mit na.omit () enthält, aber das ist nicht das, was Sie wollen. Darüber hinaus ist die derzeit akzeptierte Antwort falsch. Es gibt Ihnen die vollständige Spalten, aber nicht fallen die Zeilen, die einen oder mehrere fehlende Werte haben, die was wurde, ist gefragt. Die richtige Antwort kann so erhalten werden:

> 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

Um zu sehen, dass die obige Antwort ist falsch:

> a[ ,apply(a, 2, function(z) !any(is.na(z)))]
  a c
1 1 3
2 2 4

Zeile 1 sollte wegen der NA in 2-Säule fallen gelassen werden.

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

Auch können Sie es sqldf Bibliothek verwenden, wenn x Ihr Datenrahmen ist:

library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top