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