Làm thế nào để tìm các phần tử phổ biến từ nhiều vectơ?


159

Bất cứ ai có thể cho tôi biết làm thế nào để tìm các yếu tố phổ biến từ nhiều vectơ?

a <- c(1,3,5,7,9)
b <- c(3,6,8,9,10)
c <- c(2,3,4,5,7,9)

Tôi muốn lấy các phần tử phổ biến từ các vectơ trên (ví dụ: 3 và 9)


45
Không nên dùng ctên biến ...
Marek

4
Tại sao nó là một lá thư như những người khác?
Mostafa

12
@DimitriPetrenko vì bạn có thể khai báo danh sách với c(1,2...).
Mathias711

Câu trả lời:


333

Có thể có một cách thông minh hơn để làm điều này, nhưng

intersect(intersect(a,b),c)

sẽ làm việc

EDIT: Thông minh hơn và thuận tiện hơn nếu bạn có nhiều tranh luận:

Reduce(intersect, list(a,b,c))

16
+1 để nhắc nhở chúng tôi về Reducevà viết hoa R chính xác!
mariotomo

8
Điều đáng chú ý intersectlà dành cho các hoạt động thiết lập. Nếu bạn có các phần tử lặp lại trong các vectơ, bạn sẽ mất thông tin này vì các vectơ được biến thành các tập hợp trước khi giao nhau. Ví dụ, intersect(c(1,1,2,3), c(1,1,3,4))sẽ có kết quả c(1,3), và bạn có thể đã muốn kết quả c(1,1,3).
Giora Simchoni

1
@GioraSimchoni làm thế nào bạn có thể có được c (1,1,3), nếu đó thực sự là những gì bạn muốn?
Số liệu thống kê

@StatsSorceress Giả sử bạn muốn "ngã tư giữ gìn bản sao" của vectơ bao gồm các số nguyên dương, tất cả trong một danh sách L. Sau đây tác phẩm mã: N <- max(unlist(L)); LT <- lapply(L, tabulate, nbins = N); v <- do.call(pmin, LT); unlist(sapply(1:N, function(x) rep(x, v[x])))Một cách khác để làm điều này sẽ sử dụng các matchchức năng cùng với subscripting tiêu cực để loại bỏ lặp đi lặp lại từ mỗi vectơ mọi phần tử được thêm vào "kernel".
Montgomery Clift

24

Một câu trả lời tốt đã có, nhưng có một vài cách khác để làm điều này:

unique(c[c%in%a[a%in%b]])

hoặc là,

tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]

Rõ ràng bạn có thể bỏ qua các uniquecuộc gọi nếu bạn biết rằng không có giá trị lặp lại bên trong a, bhoặc c.


7
intersect_all <- function(a,b,...){
  all_data <- c(a,b,...)
  require(plyr)
  count_data<- length(list(a,b,...))
  freq_dist <- count(all_data)
  intersect_data <- freq_dist[which(freq_dist$freq==count_data),"x"]
  intersect_data
}


intersect_all(a,b,c)

CẬP NHẬT EDIT Một mã đơn giản hơn

intersect_all <- function(a,b,...){
  Reduce(intersect, list(a,b,...))
}

intersect_all(a,b,c)
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.