2010-09-12 31 views
94

Bất cứ ai có thể cho tôi biết cách tìm các yếu tố chung từ nhiều vectơ?Làm cách nào để tìm các phần 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 để có được những yếu tố phổ biến từ các vectơ trên (ví dụ: 3 và 9)

+24

Nó không phải là một ý tưởng tốt để sử dụng 'c' như tên biến ... – Marek

+1

lý do tại sao nó là một lá thư như những người khác? –

+4

@DimitriPetrenko vì bạn có thể khai báo các danh sách bằng 'c (1,2 ...)'. – Mathias711

Trả lời

210

Có thể có một cách thông minh để đi về việc này, nhưng

intersect(intersect(a,b),c) 

sẽ làm công việc.

EDIT: khéo léo hơn, và thuận tiện hơn nếu bạn có rất nhiều đối số:

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

+1 để nhắc nhở chúng tôi về 'Giảm' và viết hoa R chính xác! – mariotomo

+3

Cần lưu ý rằng 'giao nhau' là dành cho các hoạt động đã đặt. Nếu bạn có các phần tử định kỳ trong các vectơ, bạn sẽ mất thông tin này vì các vectơ được chuyển thành các bộ trước khi giao nhau. Ví dụ. 'intersect (c (1,1,2,3), c (1,1,3,4))' sẽ dẫn đến 'c (1,3)', và bạn có thể đã muốn kết quả 'c (1, 1,3) '. –

12

Một câu trả lời tốt rồi, 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]]) 

hay,

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

bạn rõ ràng là có thể bỏ qua unique cuộc gọi nếu bạn biết rằng không có các giá trị lặp lại trong phạm vi a, b hoặc c.

2
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

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

intersect_all(a,b,c) 
Các vấn đề liên quan