Làm cách nào để kết hợp nhiều điều kiện để tập hợp một khung dữ liệu bằng cách sử dụng HOẶC ĐỔI?


174

Tôi có 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 "HOẶC" để kết hợp các điều kiện. Tôi đã sử dụng cú pháp sau đây với rất nhiều thành công khi tôi muốn sử dụng điều kiện "VÀ".

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

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

Câu trả lời:


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

Một giải pháp thay thế bắt chước hành vi của chức năng này và sẽ phù hợp hơn để đưa vào trong một cơ thể 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 whichlà không cần thiết, nhưng nó ngăn chặn các NAgiá trị ném lại kết quả không mong muốn. Tương đương (.ie không trả về các hàng NA cho bất kỳ NA nào trong V1 hoặc V2) cho hai tùy chọn được trình bày ở trên mà không whichcó:

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

Lưu ý: Tôi muốn cảm ơn người đóng góp ẩn danh đã cố gắng sửa lỗi trong mã ngay lập tức ở trên, một bản sửa lỗi đã bị người kiểm duyệt từ chối. Thực sự 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 các giá trị NA cần phải là đầu tiên nếu nó được xử lý như tôi dự định, vì ...

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

Thứ tự các đối số có thể quan trọng khi sử dụng '& ".


1
Đây là câu hỏi được bình chọn cao nhất và sau đó người ta tìm thấy: stackoverflow.com/questions/9860090/
Khăn

1
Ưu điểm là nhỏ gọn và dễ hiểu. Nhược điểm là thiếu tiện ích trong các nhiệm vụ xây dựng chức năng. Nếu một người muốn sao chép điều này với [một nhu cầu để bọc whichhoặc sử dụng các !is.naràng buộc bổ sung .
IRTFM

Là 'cái' cần thiết và nếu không tại sao bạn sử dụng nó?
Khóa

1
Nó không "bắt buộc", nhưng bạn có thể nhận được một kết quả khác nếu bạn rời khỏi which. Nếu cả V1 và V2 là NA, bạn sẽ nhận được một hàng NA ở vị trí đó nếu bạn rời khỏi which. Tôi làm việc với các bộ dữ liệu lớn và thậm chí một tỷ lệ tương đối nhỏ của NA sẽ thực sự lấp đầy màn hình của tôi với đầu ra rác. Một số người nghĩ rằng đây là một tính năng. Tôi không.
IRTFM

Làm thế nào để bạn bao gồm một cuộc gọi đến greplhoặc grepvới điều này để thực hiện khớp mẫu cho các hàng mong muốn, ngoài các điều kiện này?
dùng5359531

31

Bạn đang tìm kiếm "|." Xem http://cran.r-project.org/doc/manuals/R-intro.html#Logical-vector

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

Điều này KHÔNG mạnh đối với sự tồn tại của NAs trong khung dữ liệu: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,]
Erdogan CEVHER

17

Để hoàn thiện, chúng ta 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 vài lựa 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", ]

tên df $ tương đương với 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"')

Đầu ra 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

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

1
Ồ Các sqldfgói là quá tốt. Rất tiện dụng đặc biệt là khi subset()bị đau một chút :)
Dawny33
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.