“VEYA” kullanarak bir veri çerçevesini alt kümeye ayarlamak için birden çok koşul nasıl birleştirilir?


174

R'de bir data.frame var. İki farklı sütun üzerinde iki farklı koşul denemek istiyorum, ancak bu koşulların kapsayıcı olmasını istiyorum. Bu nedenle, koşulları bir araya getirmek için "VEYA" kullanmak istiyorum. "VE" koşulunu kullanmak istediğimde aşağıdaki sözdizimini daha önce çok başarılı bir şekilde kullandım.

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]

Ama yukarıda 'OR' nasıl kullanılacağını bilmiyorum.

Yanıtlar:


249
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

Bu işlevin davranışını taklit eden ve bir işlev gövdesine dahil etmek için daha uygun olacak alternatif bir çözüm:

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]

Bazı insanlar kullanımını gereksiz whicholarak eleştirir , ancak NAdeğerlerin istenmeyen sonuçları geri vermesini engeller. Yukarıda gösterilen iki seçeneğe eşdeğer (.ie, V1 veya V2'deki herhangi bir NA için NA satırlarını döndürmüyor) which:

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

Not: Yukarıdaki koddaki hatayı düzeltmeye çalışan anonim katılımcıya, moderatörler tarafından reddedilen bir düzeltmeye teşekkür etmek istiyorum. Aslında ilkini düzeltirken fark ettiğim ek bir hata vardı. NA değerlerini kontrol eden koşullu cümlenin, istediğim gibi işlenecek olması durumunda ilk olması gerekir, çünkü ...

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

'& "Kullanılırken argümanların sırası önemli olabilir.


1
Bu en yüksek oyu alan soru ve sonra bir tane bulur: stackoverflow.com/questions/9860090/…
PatrickT

1
Avantaj kompaktlık ve anlaşılması kolaydır. Dezavantajı, fonksiyon geliştirme görevlerinde faydasızlıktır. Eğer kişi bunu çoğaltmak istiyorsa [sarmak whichveya ek !is.nakısıtlamalar kullanmak gerekir .
IRTFM

'Hangisi' gerekli midir ve değilse neden kullanıyorsunuz?
Cleb

1
Bu "zorunlu" değildir, ancak dışında kalırsanız farklı bir sonuç alabilirsiniz which. V1 ve V2'nin her ikisi de NA ise, dışarıda kalırsanız bu konumda bir dizi NA alırsınız which. Büyük veri kümeleriyle çalışıyorum ve NA'ların nispeten küçük bir yüzdesi bile ekranımı önemsiz çıktılarla dolduracak. Bazı insanlar bunun bir özellik olduğunu düşünüyor. Yapmıyorum.
IRTFM

bu koşullara ek olarak istenen satırlar için kalıp eşleşmesi yapmak üzere buna nasıl greplveya buna bir çağrı grepeklersiniz?
user5359531

31

"|." Bkz. Http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vectors

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]

Bu, NAbir veri çerçevesinde s varlığına sağlam DEĞİL :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,]
Erdoğan CEVHER

17

Sadece şeyiyle uğruna, biz kullanabilirsiniz [ve [[:

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

Birkaç seçenek

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]

df $ adı, df [["ad", tam = YANLIŞ] ile eşdeğerdir

Kullanma dplyr:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

Kullanma sqldf:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

Yukarıdaki seçenekler için çıktı:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j

1
bunu 1 VE koşulu ve 3 VEYA koşulu için nasıl yapardınız, örneğin: my.data.frame <- veri [veri $ V3> 10 & ((veri $ V1> 2) | (veri $ V2 <4) | (veri $ V4 <5),] Bunu yaptığımda işe yaramıyor
R Guru

1
Vaov! sqldfPaketi çok iyidir. Özellikle subset()biraz acı alır zaman çok kullanışlı :)
Dawny33
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.