2015-04-27 5 views
5

ile veri gruplamak için split işlevini kullanma konusunda bir sorum var.Bir veri çerçevesini faktöre göre gruplandırmak için bölünmüş işlevi kullanma, büyük veri çerçeveleri için seçenekler

İki sütunlu snps ve gen içeren bir veri çerçevem ​​var. Snps bir faktördür, gene bir karakter vektörüdür. Her snp'ye eşlenen bir gen listesi görebilmem için, snp faktörü ile genleri gruplamak istiyorum. Bazı snps, birden fazla gene, örneğin rs10000226, 345274 genine ve 5783 genine eşleşebilir ve genler, birçok kez meydana gelir.

Bunu yapmak için, her bir snp eşlemesinin oluşturduğu genlerin bir listesini yapmak için bölme işlevini kullandım. ve R çöker sonra df.2.rda` yüklemeye çalışıyor iken -

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

Ancak bu benim tam dataframe için (363422 satır, 281.370 benzersiz SNP, 20888 benzersiz genler muhtemelen onun büyüklüğü nedeniyle) etkin değildir.

Bunu yapmanın alternatif yolları için herhangi bir öneri çok takdir edilecektir!

+0

Neden "data.table" işlevini kullanmıyorsunuz ve sadece "snps" sütunu kullanmıyorsunuz. Sonra farklı değerleri kolayca inceleyebilirsiniz. – A5C1D2H2I1M1N2O1R2T1

+0

'split', her snp eşlemesinin bir listesini oluşturur. Aksini yapar: genlere göre gruplar ('split' için ikinci argüman). – Frank

+1

Bölünme sonrası bununla ne yapmayı planlıyorsunuz? Çıktınız nedir * gerçekten * ihtiyacınız var? – MrFlick

cevap

2

oluşturmak için daha kısa bir yol vardır senin df.2:

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

Sen genes_by_snp[["rs10000226"]] ile verilen bir SNP için genlerin bakabilirsiniz.


Veri seti bana çok büyük gelmiyor, ancak farklı şekilde orijinal verileri depolayarak yukarıda listesi oluşturmayı önlemek olabilir.

require(data.table) 

setDT(df) 
setkey(df,snps) 

Sen df[J("rs10000226")] ile verilen bir SNP için genlerin bakabilirsiniz: AnandoMahto yorumuyla @ şekilde anlatıldığı burada data.table paketi kullanmak nasıl.

+1

'data.table' içinde saklamak, vinyetlerden de öğrenebileceğiniz başka avantajlara da sahiptir: https://github.com/Rdatatable/data.table/wiki/Getting-started – Frank