2013-05-14 33 views
5

Tôi là một newbie R và tôi muốn đặt câu hỏi, mặc dù tiêu đề tương tự với các câu hỏi được đăng khác mà tôi không tìm thấy giải pháp trong đó. Câu hỏi của tôi là như sau: Tôi có một số vectơ với độ dài khác nhau và tôi muốn so sánh chúng theo cách hai chiều và áp dụng một hàm cho mỗi so sánh để tạo ra giá trị của các phần tử chung giữa các vectơ, ví dụ 4 vectơ có tên A, B, C, DI muốn tìm các phần tử chung giữa A và B, A và C, A và D, B và C, B và D, C và D.tìm các phần tử phổ biến trong một số vectơ với R và áp dụng hàm

Ví dụ chi tiết hơn ở đây (chỉ có hai vectơ):

Tôi có số lượng lớn vectơ và tôi không biết cách thực hiện vòng lặp để thực hiện so sánh cặp đôi.

Nhiều cảm ơn trước

+0

Đẩy mạnh chức năng của bạn, bạn có thể sử dụng 'sum (A% trong% B)/phút (chiều dài (A), chiều dài (B)) ' – DrDom

Trả lời

4

Bạn có thể sử dụng outer

baseSet <- c('t','qt','er','oa','qra','ea','ew','ee','qwt') 
set.seed(0) 
A <- sample(baseSet, 5) 
B <- sample(baseSet, 5) 
C <- sample(baseSet, 5) 
D <- sample(baseSet, 5) 
dFun <- function(x,y){length(which(x%in%y))/min(length(x),length(y))} 

outer(list(A,B,C,D), list(A,B,C,D),Vectorize(dFun)) 
#  [,1] [,2] [,3] [,4] 
#[1,] 1.0 0.6 0.2 0.6 
#[2,] 0.6 1.0 0.4 0.6 
#[3,] 0.2 0.4 1.0 0.4 
#[4,] 0.6 0.6 0.4 1.0 

EDIT:

list.df <- list(A=A, B=B, C=C, D=D) 
outer(list.df, list.df, Vectorize(dFun)) 
# A B C D 
#A 1.0 0.6 0.2 0.6 
#B 0.6 1.0 0.4 0.6 
#C 0.2 0.4 1.0 0.4 
#D 0.6 0.6 0.4 1.0 
+1

+1 cho 'Vectorize'! –

+0

Cảm ơn một lần nữa vì câu trả lời nhanh, nó hoạt động hoàn hảo. Nhưng, nếu tôi có tất cả các vectơ của tôi trong một danh sách có tên là list.df, thì tôi có thể áp dụng: 'outer (list.df, list.df, Vectorize (dFun)) ?? Cảm ơn một lần nữa – user2380782

+0

nó sẽ hoạt động ok – user1609452

Các vấn đề liên quan