my.data.frame <- subset(data , V1 > 2 | V2 < 4)
Alternatywne rozwiązanie, które naśladuje zachowanie tej funkcji i byłoby bardziej odpowiednie do włączenia do treści funkcji:
new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]
Niektórzy ludzie krytykują użycie which
jako niepotrzebne, ale zapobiega to NA
odrzucaniu niepożądanych wyników przez wartości. Odpowiednik (tj. Nie zwracający wierszy NA dla żadnych NA w wersji V1 lub V2) dwóm opcjom przedstawionym powyżej bez opcji which
byłby:
new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4) , ]
Uwaga: chcę podziękować anonimowemu współautorowi, który próbował naprawić błąd w kodzie powyżej, poprawka, która została odrzucona przez moderatorów. W rzeczywistości pojawił się dodatkowy błąd, który zauważyłem, poprawiając pierwszy. Klauzula warunkowa, która sprawdza wartości NA, musi być pierwsza, jeśli ma być obsługiwana zgodnie z planem, ponieważ ...
> NA & 1
[1] NA
> 0 & NA
[1] FALSE
Kolejność argumentów może mieć znaczenie w przypadku używania znaku „&”.
[
trzeba zawinąćwhich
lub zastosować dodatkowe!is.na
ograniczenia.which
. Jeśli zarówno V1, jak i V2 są NA, otrzymasz rząd NA na tej pozycji, jeśli pominieszwhich
. Pracuję z dużymi zbiorami danych i nawet stosunkowo niewielki procent NA naprawdę wypełni mój ekran niepotrzebnymi danymi. Niektórzy myślą, że to funkcja. Ja nie.grepl
lubgrep
z tym, aby oprócz tych warunków warunkowych również dopasować wzorce dla żądanych wierszy?Szukasz „|”. Zobacz http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors
źródło
NA
sw ramce danych: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,]
Dla ścisłości możemy użyć operatorów
[
i[[
:Kilka opcji
df $ nazwa jest odpowiednikiem df [["nazwa", exact = FALSE]]
Używając
dplyr
:Za pomocą
sqldf
:Dane wyjściowe dla powyższych opcji:
źródło
sqldf
Pakiet jest zbyt dobra. Bardzo przydatne, zwłaszcza gdysubset()
robi się trochę bolesne :)