2013-05-14 15 views
5

Ben bir R yeni kullanıcıyım ve bir soru sormak istiyorum, çünkü başlık diğer çözümlenen sorulara benzemese de çözümü bulamadım.R ile çeşitli vektörler arasında ortak unsurları bulun ve bir işlev uygulayın

Soruma soru şudur: Farklı uzunluklara sahip birkaç vektörüm vardır ve bunları çift yönlü olarak karşılaştırmak ve vektörler arasında ortak öğeler için bir değer oluşturmak için her karşılaştırmaya bir işlev uygulamak, örneğin, 4 vektör adlı A, B, C, DI

burada daha ayrıntılı bir örnek, (sadece iki A ve B, A ve C, A ve D, B ve C, B ve D, C ve D arasındaki ortak unsurlar bulmak istiyoruz vektörler):

A=c("t","qt","er","oa","qra") 
B=c("t","ea","ew","ee","oa","qwt") 
length(which(A%in%B))/min(length(A),length(B)) #this is the function I would like to apply to each comparison. 
0.4 #value returned for the function 

Ben vektörlerin çok sayıda var ve ikili karşılaştırmalar yapılması amacıyla döngü için nasıl uygulanacağı bilmiyorum. peşin

çok teşekkürler

+0

Eğer 'sum (% B A%) kullanabilir işlevinizi hızlandırmak için/dk (Vectorize) için (uzunluk (A), uzunluk (B)) – DrDom

cevap

4

Sen 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 

DÜZENLEME kullanabilirsiniz:

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! –

+0

Hızlı cevap için tekrar teşekkürler, mükemmel çalışır. Ancak, tüm vektörlerimi list.df adlı bir listeye eklerseniz, uygulayabilirim: 'outer (list.df, list.df, Vectorize (dFun)) ?? – user2380782

+0

tekrar – user1609452

İlgili konular