2016-04-08 9 views
0

私は異なるグループを含み、各グループにいくつかの要素があるリストを持っています。たとえば、rのリスト要素のペアを作成

>lst 
grup name 
A  cancer 
A  diabetes 
A  Alzheimer's 
A  Carcinoma 
A  Lung Diseases 
A  Adenoma 
A  Hyperplasia 
B  Cortical 
B  Aortic Aneurysm 
B  Asthma 
E  Pneumonia 
E  Asthma 

グループ 'A'、 'B'などの要素の可能なすべてのペアが必要です。 (癌、腺腫)、(がん、アルツハイマー病)、(がん、肺がん)、(がん、肺がん)、がん、過形成)は、糖尿病と同じであり、グループ「A」のすべての要素は、グループ「B」および「E」と同じである。要するに、それぞれの要素のペアは、そのグループの要素同士である。私は次のコードを試しましたが、それは私にそれがいくつかの不足している要素のリストを与えた正しい答えを与えていません。

コード:私は理解することはできません。このと間違っている何

spt <- split(lst, lst$name)# split the list into group 
dis_name <- lapply(1:length(spt), function(x) as.character(spt[[x]][[2]])) 
pr <- list() 
for(k in 1:length(dis_name)) 
{ 
    grp <- dis_name[[k]] 
    l <- length(grp) 

    for(m in 1:l) 
    { 
    for(p in 1:l) 
    { 

     pr[m][p] <- list(NULL) 
     cm <- paste(grp[m],",", grp[p]) 
     pr[[m]][[p]] <- list(cm = cm) 
    } 

    } 
} 

PR

。これは私のデータの小さな例です。私は巨大なデータを持っていますので、パッケージforeachdoSNOWでそれを実行する方法と並行して実行したいのですが。助けてください、助けていただければ幸いです。ありがとう。

私の所望の出力は「B」及び「C」の要素のための

[[1]] 
[[1]][[2]] 
"cancer , diabetes" 
[[1]][[3]] 
"cancer , Alzheimer's" 
[[1]][[4]] 
"cancer , Carcinoma" 
[[1]][[5]] 
"cancer , Lung Diseases" 
[[1]][[6]] 
"cancer , Adenoma" 
[[1]][[7]] 
"cancer , Hyperplasia" 
[[2]] 
[[2]][[1]] 
"diabets , cancer" 
[[2]][[3]] 
"diabetes , Alzheimer's" 
. 
. 
. 
[[2]][[7]] 
"diabetes , Hyperplasia" 
[[3]] 
[[3]][[1]] 
"Alzheimer's , cancer" 
. 
. 
. 
[[3]][[7]] 
"Alzheimer's , Hyperplasia" 
[[4]] 
[[4]][[1]] 
. 
. 
. 
[[4]][[7]] 
[[5]] 
[[5]][[1]] 
. 
. 
. 
[[5]][[7]] 
[[6]] 
[[6]][[1]] 
. 
. 
. 
[[7]] 
[[7]][[1]] 
. 
. 
. 

同じ

[[2]] 
[[1]] 
[[1]][[2]] 
"Cortical , Aortic Aneurysm" 
[[1]][[3]] 
"Cortical , Asthma" 
[[2]] 
[[2]][[1]] 
"Aortic Aneurysm , Cortical" 
[[2]][[3]] 
"Aortic Aneurysm , Asthma" 
[[3]] 
[[3]][[1]] 
. 
. 
[[3]][[2]] 
[[3]] 
[[1]] 
[[1]][[2]] 
"Pneumonia , Asthma" 
[[2]] 
[[2]][[1]] 
"Asthma , Pneumonia" 

私の出力がそのように見ているが、一対のある名前残ります

"Asthma , Pneumonia" 

はと同じであるが、同じ順序だけが変化すると考えられる。「肺炎、喘息」 これを1組と見なします。おかげさまで

こんにちは、ここでは、以下のソリューションが機能していない小さなデータを投稿しました。以前に与えられた例は私の実際のデータと同じであったため、エラーを出して助けてください。私は本当に何か助けに感謝します。私はエラーを解決しようとしていますが、私はできません。

sort_gene: 
data.geneSymbol data.diseaseName 
A2M    Acute Kidney Injury 
A2M    Adenoma, Liver Cell 
A2M    Alzheimer Disease 
A2M    Carcinoma, Hepatocellular 
A2M    Colonic Neoplasms 
A2M    Lung Diseases 
A2M    Lung Neoplasms 
A2M    Nephrotic Syndrome 
A4GALT    Blood group antigen p 
A4GALT    Burkitt Lymphoma 
A4GALT    Hyperostosis, Cortical, Congenital 
AAA1    Aortic Aneurysm, Familial Abdominal 1 
AAA2    Aortic Aneurysm, Familial Abdominal 2 

Error:Error in FUN(X[[i]], ...) : n < m 

これを私に教えてください。私は本当に助けが必要です。ありがとう

+1

希望の出力を投稿してください。 'lapply(split(lst $ name、lst $ grup)、combn、2)'のようなものを探していますか? – nicola

+0

感謝のニコラ、私は私の希望の出力を編集しました。 –

答えて

1

私はこれがあなたが必要とすると思います。 2行目は基本的にはニコラの提案であり、3行目は出力のフォーマットです。

lst <- data.frame(grup = c(rep("A", 7), rep("B", 3), "E", "E"), name = c("cancer", "diabetes", "Alzheimer's", "Carcinoma", "Lung Diseases", "Adenoma", "Hyperplasia", "Cortical", "Aortic Aneurysm", "Asthma", "Pneumonia", "Asthma")) 
output <- lapply(split(lst$name, lst$grup), combn, 2, simplify = F) 
output <- lapply(output, function(x) lapply(x, as.character)) 

そして、一つの文字列ではなく、ベクターに各ペアをオンにし、各ペアの頻度を計算します。

output <- lapply(output, function(x) lapply(x, paste, collapse = " ")) 
table(unlist(output)) 
+0

Yaa Dan Lewerありがとうございました。私は各ペアの頻度を計算したいので、私は出力 '$ A'でグループ名を望んでいません。ですから、この出力では、各ペアが何回発生したのか分かりません。どのように各ペアの頻度を計算するか。 –

+0

編集した回答のように、「unlist」してから表にすることができます。それで解決しますか? –

+0

ヤア・ダン、それは私の問題を解決しています。どうもありがとうございます。第二の質問のために、私がこれをどのように行うよりも並行して実行したいのであれば助けてください。 –

1

は(lstはダンLewerの答えからである)、これを試してみてください:

setNames(lapply(split(lst$name, lst$grup), 
     function(x) combn(x,2,simplify=FALSE,FUN=paste,collapse=" , ")),NULL) 
#[[1]] 
#[[1]][[1]] 
#[1] "cancer , diabetes" 
# 
#[[1]][[2]] 
#[1] "cancer , Alzheimer's" 
# 
#[[1]][[3]] 
#[1] "cancer , Carcinoma" 
#... 
+0

ありがとうnicolaそれはまた私の仕事の敵です。 –

関連する問題