2013-05-14 8 views
5

Jestem nowicjuszem R i chciałbym zadać pytanie, chociaż tytuł jest podobny do innych wysłanych pytań, w których nie znalazłem rozwiązania.znajdź wspólne elementy spośród wielu wektorów z R i zastosuj funkcję

Moje pytanie jest następujące: Mam kilka wektorów o różnych długościach i chciałbym je porównać parami i zastosować funkcję do każdego porównania do generowania wartości wspólnych elementów między wektorami, na przykład 4 wektory o nazwie A, B, C, DI chciałby znaleźć wspólne elementy między A i B, A i C, A i D, B i C, B i D, C i D.

Bardziej szczegółowy przykład tutaj (tylko dwa wektory):

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 

mam dużą liczbę wektorów i nie wiem jak zaimplementować pętli for w celu dokonania porównań parami.

Wiele z góry dzięki

+0

przyspieszyć swoją funkcję można użyć 'sumę (w% w% B)/min (długość (A), długość (B)) ' – DrDom

Odpowiedz

4

Można używać 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 dla' Wektoryzacji'! –

+0

Jeszcze raz dziękuję za szybką odpowiedź, działa idealnie. Ale jeśli mam wszystkie moje wektory na liście o nazwie list.df, to czy mogę zastosować: 'zewnętrzny (list.df, list.df, Vectorize (dFun))? Jeszcze raz dziękuję – user2380782

+0

powinno działać ok. – user1609452

Powiązane problemy