2017-06-28 3 views
1

Ich habe eine Liste mit Vektoren von Wörtern, die unterschiedliche Länge haben. Ich möchte einen Datenrahmen erstellen, der Informationen über die Überlappung zwischen jedem dieser Wortvektoren in Bezug auf die anderen enthält.Auf der Suche nach effizienteren Weg, um diese Berechnung durchzuführen

Ich habe ein Doppel jetzt für Schleife, die überprüft, wie viele Wörter in jeder der anderen Einträge mit Summe (l [i]% in% l [j]) sind, wenn i nicht gleich j ist

Meine aktuelle Methode scheint ineffizient zu sein, liefert aber die richtige Antwort. Was ist der beste Weg, dies zu tun?

l = list() 
l <- c(l,list(c("word","another","hi","words"))) 
l <- c(l,list(c("word","maybe","nope"))) 
l <- c(l,list(c("maybe","nope"))) 
df <- data.frame(index = 0,one = 0,two = 0) 
for(i in 1:length(l)){ 
    df <- rbind(df,data.frame(index = i,one = 0,two = 0)) 
    for(j in 1:length(l)){ 
    if(i == j){next} 
    truth_vec <- sum(l[[i]] %in% l[[j]]) 
    if(truth_vec == 1){df[i + 1,]$one = df[i + 1,]$one + 1} 
    else if(truth_vec == 2){df[i + 1,]$two = df[i + 1,]$two + 1} 
    else{NULL} 
    } 
} 
+0

@thelatemail, sollten Sie als Antwort – CPak

+1

@ChiPak posten - Ich hatte auf einige Klärung von OP zuerst auf, was sie als Ausgabe wollen. – thelatemail

+0

Richtig, es ist immer noch eine nette Antwort, auch wenn das Format nicht ganz das ist, wonach OP sucht. – CPak

Antwort

1

Sie für die intersection jeder paarweise Kombination von l aussehen könnte:

combn(l, 2, FUN=function(x) length(intersect(x[[1]],x[[2]]))) 
#[1] 1 0 2 

Wo 1 überlappen, wenn (i = 1, j = 2), 0, wenn (i = 1, j = 3) und 2 wenn (i = 2, j = 3).

+0

Es ist wichtig, dass ich im Datenrahmen auf einfache Weise auf die IDs zugreifen kann – user2997345

Verwandte Themen