my.data.frame <- subset(data , V1 > 2 | V2 < 4)
Eine alternative Lösung, die das Verhalten dieser Funktion nachahmt und für die Aufnahme in einen Funktionskörper besser geeignet wäre:
new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]
Einige Leute kritisieren die Verwendung von which
als nicht erforderlich, aber es verhindert, dass die NA
Werte unerwünschte Ergebnisse zurückwerfen. Das Äquivalent (dh keine NA-Zeilen für NAs in V1 oder V2 zurückgeben) zu den beiden oben gezeigten Optionen ohne das which
wäre:
new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4) , ]
Hinweis: Ich möchte mich bei dem anonymen Mitwirkenden bedanken, der versucht hat, den Fehler im Code direkt darüber zu beheben. Dieser Fehler wurde von den Moderatoren abgelehnt. Es gab tatsächlich einen zusätzlichen Fehler, den ich bemerkte, als ich den ersten korrigierte. Die Bedingungsklausel, die nach NA-Werten sucht, muss an erster Stelle stehen, wenn sie wie beabsichtigt behandelt werden soll, da ...
> NA & 1
[1] NA
> 0 & NA
[1] FALSE
Die Reihenfolge der Argumente kann bei der Verwendung von '& "von Bedeutung sein.
[
musswhich
man zusätzliche!is.na
Einschränkungen einschließen oder verwenden .which
. Wenn sowohl V1 als auch V2 NA sind, würden Sie eine Reihe von NAs an dieser Position erhalten, wenn Sie die weglassenwhich
. Ich arbeite mit großen Datenmengen und selbst ein relativ kleiner Prozentsatz der NAs füllt meinen Bildschirm wirklich mit Junk-Ausgabe. Einige Leute denken, dass dies eine Funktion ist. Ich nicht.grepl
odergrep
mit diesem hinzu, um zusätzlich zu diesen Bedingungen auch einen Mustervergleich für die gewünschten Zeilen durchzuführen?Sie suchen nach "|." Siehe http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors
quelle
NA
s in einem Datenrahmen:vc <- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
Der Vollständigkeit halber können wir die Operatoren verwenden
[
und[[
:Mehrere Möglichkeiten
df $ name entspricht df [["name", genau = FALSE]]
Verwenden von
dplyr
:Verwenden von
sqldf
:Ausgabe für die oben genannten Optionen:
quelle
sqldf
Paket ist zu gut. Sehr praktisch, besonders wenn essubset()
etwas schmerzhaft wird :)