2011-02-08 24 views
123

R'de bir data.frame var. İki farklı sütunda iki farklı koşul denemek istiyorum, ancak bu koşulların kapsayıcı olmasını istiyorum. Bu nedenle, koşulları birleştirmek için "VEYA" kullanmak istiyorum. "AND" koşulunu kullanmak istediğimde, aşağıdaki sözdizimini çok başarılı bir şekilde kullanmıştım."OR" işlevini kullanarak veri çerçevesini alt kümeye almak için birden çok koşul nasıl birleştirilir?

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

Ancak, yukarıdaki "OR" kelimesini nasıl kullanacağımı bilmiyorum.

+161

Bunun gibi 'temel' sorular hakkında tereddüt etmek yerine, onları interneti daha iyi hale getirmek için bir fırsat olarak görüntüleyin. SO'nın google-suyu güçlü ve her seferinde bir soru, 2004'teki korkunç bir listerv sorusunun yerini aldığında bir melek kanatlarını alır. – Andrew

+0

Listelerden kaçan soruları küçümsemek, nasıl arama yapılacağını öğrenmek isteyen kişilere karşı bir zarara yol açıyor. Kişiler, özel sorular için iyi bir arama motoru kullanmayı düşünmelidir. Seçimim http://markmail.org/search/?q=list%3Aorg.r-project ancak diğerleri Rseek.org'u seçebilir. –

+6

Listserv soruları bertaraf eden yorumların aşağılayıcı olduğunu düşünmüyorum aşağılayıcı olmayan yorumları okumak isteyen kişiler için bir zararı – hedgedandlevered

cevap

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

bu işlevin davranışı taklit ediyor ve bir işlev gövdesinin içindeki dahil daha uygun olur alternatif bir çözüm bakın gerekli, ancak NA değerlerinin istenmeyen sonuçları geri atmasını engelliyor. eşdeğer olacaktır which olmadan yukarıda gösterildiği iki seçenek için (.ie herhangi NA adlı V1 veya V2 için NA-satırları dönen değil):

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

Not: Ben gidermeye çalıştı anonim katkı yapan teşekkür etmek istiyorum hemen yukarıdaki kodda hata, moderatörler tarafından reddedilen bir düzeltme. İlkini düzelttiğimde fark ettiğim bir hata daha vardı. NA değerleri için denetler şart cümlesi argümanlardan

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

Sipariş "& 'kullanırken önemli olabilir ... ben amaçlandığı gibi, çünkü işlenecek ise ilk olması gerekiyor.

+0

Bu en yüksek oylanan soru ve daha sonra şu bulur: http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset – PatrickT

+1

Avantaj, kompaktlık ve kavrama kolaylığıdır. Dezavantajı, işlev oluşturma görevlerinde yararsızdır. Eğer biri bunu kopyalamak isterse ['' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'ile' '' '' '' '' '' '' 'sarmak gerekir. –

+0

'Hangi' gerekli ve eğer neden kullanmıyorsunuz? – Cleb

8

Sadece için

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

Çeşitli seçenekler

: tamlığı uğruna, biz operatörleri [ ve [[ kullanabilirsiniz Yukarıdaki seçenekleri için

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

Çıktı:

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

sqldf kullanma:

df $ isim [, kesin = YANLIŞ] [ "name"] dplyr Kullanılması

df equivalent to olduğunu :

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

1 AND koşul ve 3 OR koşulları için aşağıdakileri nasıl yaparsınız, örneğin: my.data.frame <- data [data $ V3> 10 & (veri $ V1> 2) | (data $ V2 <4) | (data $ V4 <5),] Bunu yaptığımda işe yaramıyor –

+0

Wow! 'sqldf' paketi çok iyi. Özellikle altkullanıcı() 'biraz ağrılı olduğunda çok kullanışlıdır :) – Dawny33