2011-02-08 5 views
123

Tôi có một data.frame trong R. Tôi muốn thử hai điều kiện khác nhau trên hai cột khác nhau, nhưng tôi muốn các điều kiện này được bao gồm. Do đó, tôi muốn sử dụng "OR" để kết hợp các điều kiện. Tôi đã sử dụng cú pháp sau đây trước đây với rất nhiều thành công khi tôi muốn sử dụng điều kiện "AND".Làm thế nào để kết hợp nhiều điều kiện để đặt một khung dữ liệu bằng cách sử dụng "OR"?

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

Nhưng tôi không biết cách sử dụng 'OR' ở trên.

+161

Thay vì thử nghiệm các câu hỏi 'cơ bản' như thế này, hãy xem chúng như một cơ hội để làm cho internet tốt hơn. SO của google-nước là mạnh mẽ, và mỗi khi một câu hỏi SO thay thế một câu hỏi listerv khủng khiếp từ năm 2004 một thiên thần được cánh của nó. – Andrew

+0

Tôi nghĩ rằng các câu hỏi listerv disparaging là một sự bất mãn cho những người tìm cách tìm hiểu cách tìm kiếm. Mọi người nên xem xét sử dụng một công cụ tìm kiếm tốt cho các câu hỏi chuyên ngành. Lựa chọn của tôi là http://markmail.org/search/?q=list%3Aorg.r-project nhưng những người khác có thể chọn Rseek.org. –

+6

Tôi nghĩ rằng những lời bình luận phân biệt đối xử với các câu hỏi là một sự bất đồng đối với những người muốn đọc các ý kiến ​​không phân biệt – hedgedandlevered

Trả lời

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

Một giải pháp thay thế mà bắt chước hành vi của chức năng này và sẽ thích hợp hơn để đưa vào trong một cơ quan chức năng:

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

Một số người chỉ trích việc sử dụng which như không cần thiết, nhưng nó ngăn chặn các giá trị NA từ việc ném lại các kết quả không mong muốn. Tương đương (.ie không trở về NA-hàng cho bất kỳ NA trong V1 hay V2) với hai tùy chọn trình bày ở trên mà không có sự which sẽ là:

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

Lưu ý: Tôi muốn cảm ơn những đóng góp vô danh mà cố gắng để sửa chữa lỗi trong mã ngay phía trên, một bản sửa lỗi đã bị người kiểm duyệt từ chối. Có một lỗi bổ sung mà tôi nhận thấy khi tôi sửa lỗi đầu tiên. Mệnh đề có điều kiện để kiểm tra cho các giá trị NA cần phải được đầu tiên nếu nó được xử lý như tôi dự định, kể từ khi ...

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

Trình tự lập luận có thể có vấn đề khi sử dụng '&".

+0

Đây là câu hỏi được bỏ phiếu cao nhất và sau đó tìm thấy: http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset – PatrickT

+1

Lợi thế là sự gọn nhẹ và dễ hiểu. Điểm bất lợi là thiếu tiện ích trong các nhiệm vụ xây dựng chức năng. Nếu người ta muốn sao chép điều này với '[' một trong những nhu cầu để bọc trong 'đó' hoặc sử dụng bổ sung'! Is.na' ràng buộc. –

+0

'Yêu cầu' có cần thiết không và nếu bạn không sử dụng? – Cleb

8

Just for vì lợi ích của sự hoàn chỉnh, chúng tôi có thể sử dụng các toán tử [[[:

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

Một số tùy chọn

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 $ name là equivalent to df [[ "name", chính xác = FALSE]]

Sử dụng dplyr:

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

Sử dụng sqldf:

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

Output cho các tùy chọn ở trên :

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

bạn sẽ làm điều này như thế nào cho 1 VÀ điều kiện và 3 OR điều kiện tùy thuộc vào ví dụ: my.data.frame <- data [data $ V3> 10 & ((dữ liệu $ V1> 2) | (dữ liệu $ V2 <4) | (dữ liệu $ V4 <5),] Khi tôi làm điều này nó không hoạt động –

+0

Wow! Gói 'sqldf' quá tốt. Rất tiện dụng đặc biệt khi' tập hợp con() 'bị một chút đau đớn :) – Dawny33