2017-06-28 7 views
1

私はさまざまな長さの単語のベクトルを含むリストを持っています。私は、これらの単語ベクトルのそれぞれと他の単語ベクトルとの間の重なりに関する情報を含むデータフレームを作成したい。この計算を行うより効率的な方法をお探しください

iがjを

に等しくない場合、私は([I]%のL [J]で%をL)は、多くの単語が和と他のエントリのそれぞれにあるかチェックすること、今ループの二重を有します

私の現在の方法は非効率であるように見えますが、正しい答えを示しています。これを行う最もRの方法は何ですか?

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あなたは答えとして – CPak

+1

@ChiPakとして投稿する必要があります - 私は彼らが出力として何を望んでいるのかOPの最初の明確化を望んでいました。 – thelatemail

+0

フォーマットがOPが探しているものではない場合でも、それはまだ素晴らしい答えです。 – CPak

答えて

1

あなたはlの各ペアごとの組み合わせのintersectionを探すことができます:

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

どこ1つのオーバーラップ(I = 1、J = 2)、0時に(I = 1、J = 3)、2(i = 2、j = 3)のときは2となる。

+0

データフレームで簡単にIDにアクセスできることが重要です – user2997345

関連する問題