2017-12-28 18 views
1

私はこことGoogleで答えを見つけようとしましたが、運が良かったのでこの問題で数日間苦労しました。私は、サイクルが慎重なコミュニティー内にあるのか、それらの間にあるのか、パターンがないのかを調べるためにネットワークを分析しています。私のデータは、サイクルのリスト(ループを形成する3つのノード)とコミュニティのリスト(ノードの可変量)です。私は2つの質問があり、1)どのように二つのリストを比較すると、2)どのように読みやすい形で出力比較結果を:私は2つのリスト(両方IGRAPHを持って2つのリストを比較して "ヒット"をデータフレームに出力する方法

  • 質問1

オブジェクト)、678個のアイテム(それぞれ3つのエレメント、すべての文字)と、異なるエレメント数を持つそれぞれ11個のアイテムが含まれています。例:

x1 <- as.character(c(1,3,5)) 
x2 <- as.character(c(2,4,6)) 
x3 <- as.character(c(7,8,9)) 
x4 <- as.character(c(10,11,12)) 
x <- list(x1, x2, x3, x4) 

y1 <- as.character(c(1,2,3,4,5)) 
y2 <- as.character(c(2,3,4,5)) 
y3 <- as.character(c(1,2,3,4,5,7,8,9)) 
y <- list(y1, y2, y3) 

寄付:

> x 
[[1]] 
[1] "1" "3" "5" 

[[2]] 
[1] "2" "4" "6" 

[[3]] 
[1] "7" "8" "9" 

[[4]] 
[1] "10" "11" "12" 

> y 
[[1]] 
[1] "1" "2" "3" "4" "5" 

[[2]] 
[1] "2" "3" "4" "5" 

[[3]] 
[1] "1" "2" "3" "4" "5" "7" "8" "9" 

私はすべてのヒットをyにすべてのコンポーネントに対してxにすべてのコンポーネントを比較し、追加したい(すなわちx[[i]]からすべての要素もy[[i]]で発見された場合)に新しいデータフレーム私はall()%in%を使用してループを試してみましたが、これは動作しませんでした:

for (i in 1:length(x)) { 
    for (j in 1:length(y)) { 
    hits <- all(y[[j]] %in% x[[i]]) == TRUE 
    print(hits) 
     } 
    } 

これは12本のFALSEヒットを返します。

all(x[[1]] %in% y[[1]]) 

返しTRUEそれが必要として、そして:

all(x[[1]] %in% y[[2]]) 

返しFALSEそれが必要として、個々のコンポーネントの確認、それがために、働いているはずです。私はここでどこが間違っていますか?

  • 質問は2

私はDFにループした結果を出力するためのいくつかのソリューションを見てきましたが、それは私が必要なものを正確ではありません。私がアウトプットとして望むのは、各サイクルがどのコミュニティに入っているかを示すデータフレームです。11のコミュニティしかないので、リストコンポーネントのインデックスを参照できるだけですが、これを行う方法は見つけられていません。 paste()を使用して、コミュニティのノード名をタイトルに連結することもできます。いずれにしても、必要な出力は次のとおりです。

cycle  community 
1 1_3_5  1_2_3_4_5 
2 1_3_5 1_2_3_4_5_7_8_9 
3 7_8_9 1_2_3_4_5_7_8_9 

私は何らかのif文を推測しています。私はこれが実行するのがかなり簡単でなければならないと思っています。それにもかかわらず、あなたの時間に感謝し、エッセイを残念に思っています。

答えて

1

あなたがヒットを持っているインデックスを保存し、後でのためにそれらを使用することができます第二部については

for (i in 1:length(x)) { 
    for (j in 1:length(y)) { 
    # hits <- all(y[[j]] %in% x[[i]]) == TRUE 
    hits <- all(x[[i]] %in% y[[j]]) == TRUE 
    print(hits) 
    } 
} 

ミスを犯しました。

a <- list() 
for (i in 1:length(x)) { 
    for (j in 1:length(y)) { 
    # hits <- all(y[[j]] %in% x[[i]]) == TRUE 
    hits <- all(x[[i]] %in% y[[j]]) == TRUE 
    if(hits == TRUE){ 
     a[[length(a)+1]] <- c(i,j) 
     } 
    } 
} 
+0

はい。ありがとう= D。これは〜400のインデックスペア、サイクルとコミュニティを持つリストを私に与えます。だから、このリストを争うのは単なる問題です。 – ec1013

1

(コメントで指摘したようにまたはpaste())質問の最後の部分、サイクルとコミュニティタグの作成は、stringi::stri_join()を用いて達成することができます。 Jt Miclatの答えで作成されたリストをまとめる最後のステップは、リストaのインデックスを使ってcyclecommunityの適切な文字列を抽出し、データフレームを生成し、結果を単一のデータフレームにrbind()として得ます。

# combine with cycle & community tags 
cycles <- sapply(x,paste,collapse="_") 
communities <- sapply(y,paste,collapse="_") 
b <- lapply(a,function(x){ 
    cycle <- cycles[x[1]] 
    community <- communities[x[2]] 
    data.frame(x=x[1],y=x[2],cycle=cycle,community=community, 
       stringsAsFactors=FALSE) 
}) 
df <- do.call(rbind,b) 
df 

...と出力:

> df <- do.call(rbind,b) 
> df 
    x y cycle  community 
1 1 1 1_3_5  1_2_3_4_5 
2 1 3 1_3_5 1_2_3_4_5_7_8_9 
3 3 3 7_8_9 1_2_3_4_5_7_8_9 
> 
+0

これが目的であれば、あなたがやっていることすべてを必要とせず、サイクルのために 'sapply(x、paste、collapse =" _ ")'とサプリー(y、paste 、崩壊= "_") 'コミュニティ。しかし、もう一度質問を読んでください。この回答は完全に役に立たない – Onyambu

0

さてあなたはouterを利用することができます:yが列である一方、

outer(x,y,function(w,z)Map(function(i,j)all(i%in%j),w,z))->results 
     [,1] [,2] [,3] 
[1,] TRUE FALSE TRUE 
[2,] FALSE FALSE FALSE 
[3,] FALSE FALSE TRUE 
[4,] FALSE FALSE FALSE 

xはそうall(x[[1]]%in%y[[2]])をチェックするために、行であります、行1の列2、つまり要素[1,2]などを確認してください。

applyと独自の作成関数を使用することができます。

fun<-function(i)c(paste(x[[i[1]]],collapse ="_"), paste(y[[i[2]]],collapse ="_")) 
t(apply(which(result==T,T),1,fun)) 
    [,1] [,2]    
[1,] "1_3_5" "1_2_3_4_5"  
[2,] "1_3_5" "1_2_3_4_5_7_8_9" 
[3,] "7_8_9" "1_2_3_4_5_7_8_9" 
+0

私はアイデアと結果の行列が好きです!私はそれが私の実際のデータの結果の数のために扱いにくいと感じているので、私はそれを使用して終了していません – ec1013

+0

あなたがまだ問題を解決するようにそれをアップヴォートすることができますが – Onyambu

+1

私がした;)しかし私の評判は低すぎるカウント – ec1013

関連する問題