2015-04-27 10 views
5

Ho una domanda sull'utilizzo della funzione split per raggruppare i dati per factor.Utilizzo della funzione split per raggruppare un dataframe per fattore, alternative per i dataframes grandi

Ho un frame dati di due colonne snps e gene. Snps è un fattore, gene è un vettore di caratteri. Voglio raggruppare i geni per il fattore snp in modo da poter vedere una lista di geni che mappano ogni snp. Alcuni snp possono mappare a più di un gene, ad esempio le mappe rs10000226 al gene 345274 e il gene 5783, ei geni si verificano più volte.

Per fare ciò ho usato la funzione di divisione per creare un elenco di geni a cui ogni mappa snp.

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

Tuttavia questo non è efficace per il mio pieno dataframe (probabilmente a causa delle sue dimensioni - 363422, 281370 file SNP unici, 20888 geni unici) e si blocca R mentre sta cercando di caricare df.2.rda` in seguito.

Qualsiasi suggerimento per modi alternativi di fare questo sarebbe molto apprezzato!

+0

Perché non utilizzare "data.table" e solo tasto per la colonna "snps". Quindi puoi facilmente ispezionare valori diversi. – A5C1D2H2I1M1N2O1R2T1

+0

Il tuo 'split' non" crea una lista di geni a cui ogni snp fa riferimento. " Fa il contrario: gruppi per gene (il secondo argomento per 'split'). – Frank

+1

Cosa pensi di fare dopo la divisione? Qual è l'output che * davvero * serve? – MrFlick

risposta

2

C'è una via più breve per creare la tua df.2:

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

Potete guardare i geni per un dato SNP con genes_by_snp[["rs10000226"]].


Il set di dati non sembra così grande per me, ma si potrebbe evitare la creazione di lista di cui sopra memorizzando i dati originali in modo diverso. Ampliando @ commento di AnandoMahto, ecco come utilizzare il pacchetto data.table:

require(data.table) 

setDT(df) 
setkey(df,snps) 

Potete guardare i geni per un dato SNP con df[J("rs10000226")].

+1

La memorizzazione in un 'data.table' ha anche altri vantaggi, che puoi imparare dalle vignette: https://github.com/Rdatatable/data.table/wiki/Getting-started – Frank

Problemi correlati