2016-04-08 5 views
0

Ich habe eine Liste, die verschiedene Gruppen enthalten und jede Gruppe hat ein Element; zum BeispielErstellen Sie ein Paar Listenelement in r

Jetzt möchte ich alle möglichen Paare von Elementen aus der Gruppe 'A', 'B' und so weiter. Es gibt sieben Elemente in "A", also die Paare, die ich will, ist wie (Krebs, Diabetes), (Krebs, Alzheimer), (Krebs, Karzinom), (Krebs, Lungenkrankheit), (Krebs, Adenom), (Krebs, Hyperplasie) für Diabetes und alle Elemente der Gruppe A gleich wie für die Gruppen B und E. Kurz gesagt, ein Paar von jedem Element mit jedem anderen Element dieser Gruppe. Ich habe versucht, den folgenden Code, aber es gibt mir nicht die richtige Antwort gab es die Liste mit einigen fehlenden Element.

Code:

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

Was mit diesem ist falsch, ich kann nicht verstehen. Dies ist ein kleines Beispiel für meine Daten, ich habe riesige Daten, also wenn ich es parallel ausführen möchte, als, wie es mit Paket foreach und doSNOW ausgeführt wird. Bitte helfen Sie, jede Hilfe wird geschätzt. Vielen Dank.

My gewünschte Ausgabe ist:

[[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]] 
. 
. 
. 

gleiche gilt für die Elemente der 'B' und 'C'

[[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" 

My Ausgang ist wie die aus, aber das Paar, in dem die Namen Reste gleich, aber nur würde die Reihenfolge zu ändern sein wird als eine betrachtet sagen:

"Asthma , Pneumonia" 

gleiche ist wie "Pneumonie, Asthma" so betrachteten es als ein Paar. Danke.

Hallo, hier habe ich den kleinen Teil meiner Daten gepostet, für die die unten angegebene Lösung nicht funktioniert Ich kann nicht verstehen, was falsch ist, weil das Beispiel, das ich vorher gegeben wurde, genauso wie meine echten Daten noch nicht war Arbeit und gab den Fehler bitte helfen. Ich habe jede Hilfe sehr geschätzt. Ich versuche den Fehler zu lösen, aber ich kann nicht.

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 

Bitte bringen Sie mich aus diesem heraus. Ich brauche wirklich Hilfe. Danke

+1

Bitte senden Sie Ihre gewünschte Ausgabe. Suchst du nach etwas ähnlich wie 'lapply (split (lst $ name, lst $ grup), combn, 2)'? – nicola

+0

Danke Nicola, ich habe meine gewünschte Ausgabe bearbeitet. –

Antwort

1

Ich denke, das tut, was Sie brauchen. Die zweite Zeile ist im Grunde, was Nicola vorgeschlagen hat, und die dritte Zeile formatiert die Ausgabe.

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)) 

Dann jedes Paar in einer einzigen Saite drehen, anstatt einen Vektor und berechnen die Frequenz jedes Paares:

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

Yaa Danke Dan Lewer. aber ich will nicht den Gruppennamen in der Ausgabe '$ A', weil ich die Häufigkeit jedes Paares berechnen möchte.Mit dieser Ausgabe kann ich nicht herausfinden, wie oft jedes Paar aufgetreten ist. So, wie man die Frequenz jedes Paares berechnet. –

+0

Sie können "unlist" und dann tabellarisch, wie in meiner bearbeiteten Antwort. Löst das das? –

+0

Yaa Dan, es ist mein Problem zu lösen. Ich danke dir sehr. Könntest du für die zweite Frage helfen, wenn ich das parallel laufen lassen möchte, wie es geht? –

1

Try this (lst ist von Dan Lewer Antwort):

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

Danke Nicola, es ist auch Arbeit Feind. –

Verwandte Themen