2015-04-27 14 views
5

Ich habe eine Frage bezüglich der Verwendung der split Funktion zum Gruppieren von Daten von factor.Verwenden der Split-Funktion zum Gruppieren eines Datenrahmens nach Faktor, Alternativen für große Datenrahmen

Ich habe einen Datenrahmen von zwei Spalten Snps und Gen. Snps ist ein Faktor, gene ist ein Zeichenvektor. Ich möchte Gene nach dem SNP-Faktor gruppieren, damit ich eine Liste von Genen sehen kann, die auf jedes SNP-Gen mappt. Einige snps können mehr als einem Gen zugeordnet werden, zum Beispiel rs10000226 Karten zu Gen 345274 und Gen 5783, und Gene treten mehrmals auf.

Um dies zu tun, habe ich die Split-Funktion verwendet, um eine Liste von Genen zu erstellen, die jeder snp zugeordnet ist.

snps<-c("rs10000185", "rs1000022", "rs10000226", "rs10000226") 

gene<-c("5783", "171425", "345274", "5783") 

df<-data.frame(snps, gene) # snps is a factor 

df$gene<-as.character(df$gene) 

splitted=split(df, df$gene, drop=T) # group by gene 

snpnames=unique(df$snps) 

df.2<-lapply(splitted, function(x) { x["snps"] <- NULL; x }) # remove the snp column 

names(df.2)=snpnames # rename the list elements by snp 

df.2 = sapply(df.2, function(x) list(as.character(x$gene))) 

save(df.2, file="df.2.rda") 

Dies ist jedoch nicht effektiv für meinen vollen Datenrahmen (wahrscheinlich aufgrund seiner Größe - 363422 Reihen, 281.370 einzigartigen SNPs, 20888 einzigartige Gene) und R Abstürze während versuchen, später zu laden df.2.rda`.

Irgendwelche Vorschläge für alternative Möglichkeiten, dies zu tun, wäre sehr willkommen!

+0

Warum verwenden Sie nicht "data.table" und nur Schlüssel durch die Spalte "snps". Dann können Sie einfach verschiedene Werte überprüfen. – A5C1D2H2I1M1N2O1R2T1

+0

Ihr 'split' erstellt keine Liste von Genen, denen jeder snp zugeordnet ist." Es macht das Gegenteil: Gruppen nach Gen (das zweite Argument zu "Split"). – Frank

+1

Was planen Sie nach der Trennung damit? Was ist der Output, den du * wirklich * brauchst? – MrFlick

Antwort

2

Es gibt einen kürzeren Weg, um Ihre df.2 zu erstellen:

genes_by_snp <- split(df$gene,df$snp) 

Sie bei den Genen für eine bestimmte SNPs mit genes_by_snp[["rs10000226"]] aussehen kann.

Ihr Datensatz klingt nicht so groß für mich, aber Sie könnten vermeiden, die obige Liste zu erstellen, indem Sie Ihre ursprünglichen Daten anders speichern. In Erweiterung @ AnandoMahto Kommentar, hier ist, wie das data.table Paket verwenden:

require(data.table) 

setDT(df) 
setkey(df,snps) 

Sie bei den Genen für eine bestimmte SNPs mit df[J("rs10000226")] aussehen können.

+1

Das Speichern in einer 'data.table' hat noch weitere Vorteile, die Sie aus den Vignetten herauslesen können: https://github.com/Rdatatable/data.table/wiki/Getting-started – Frank