2012-04-03 33 views
2

ich eine Liste haben wie diese my.list[[file.id]][value.id]]<-a value(1 or 0) strukturiert. Die selbe value.id kann in verschiedenen Datei-IDs existieren.R: reorganisieren Liste in Matrix

I eine Matrix mit rownames wie alle value.ids benötigen, sind COLNAMES file.ids und jede Zelle ist my.list[[file.id]][[value.id]].

Gibt es einen schnellen Weg, dies zu tun, ohne wie verrückt laufen?

SAMPLE DATA:

Liste:

$`Zhou_et_al_2004` 
    CDC42:P60953 CDK2D:NONAME MAPK12:P53778 E2F3:NONAME GRB2:P62424 GRB2:P62993  RFA:NONAME 
      "up"   "up"   "down"   "down"   "down"   "down"   "down" 
    CDK9:P50750 JUP/DP3:NONAME MEK1:NONAME RFC38:NONAME  DP2:NONAME RFC37:NONAME GADD45:NONAME 
     "down"   "down"   "down"   "down"   "down"   "down"   "down" 

$`Zhou_et_al_2006` 
    CTTN:Q14247 GTSE1:Q9NYZ3  CHST11:Q9N  CHST11:PF2 TNRC6A:Q8NDV7 MMP9:P14780  NRIP3:Q9N 
      "up"   "up"   "up"   "up"   "up"   "up"   "up" 
    NRIP3:Q35 EGFR:P00533 GFPT2:NONAME TPCN2:Q8NHX9  BBP:NONAME SQLE:Q14534 DISP2:NONAME 
      "up"   "up"   "up"   "up"   "up"   "up"   "up" 
    PAPPA:Q13219 BMP2:P12643 PCM1:Q15154 SUCLG2:Q96I99 ASAH1:Q13510 UQCRC2:P22695 MTUS1:NONAME 
      "up"   "up"   "down"   "down"   "down"   "down"   "down" 
    MUC20:NONAME FRAT2:NONAME PLA2G4A:P47712 
     "down"   "down"   "down" 

$`Zhou_et_al_2007` 
    CTTN:Q14247 GTSE1:Q9NYZ3  CHST11:Q9N  CHST11:PF2 TNRC6A:Q8NDV7  NRIP3:Q9N 
      "up"   "up"   "up"   "up"   "up"   "up" 
     NRIP3:Q35 USP32:Q8NFA0 PPFIBP1:Q86W92 MALAT1:NONAME TRA2A:NONAME MGC17624:NONAME 
      "up"   "up"   "up"   "up"   "up"   "up" 
    SLC6A2:P23975 USP42:Q9H9J4 RASEF:NONAME SEMA3C:Q99985  NDE1:Q9NXR1  TRA1:NONAME 
      "up"   "up"   "up"   "up"   "up"   "up" 
    PPFIA1:Q13136 PPFIA1:Q16787 ITGA9:Q13797 ITGA9:Q14469  LMO2:P25791 NR2F2:P24468 
      "up"   "up"   "down"   "down"   "down"   "down" 
KIAA0882:NONAME  PCM1:Q15154  CYB5:NONAME  IDH1:NONAME MYLIP:Q8WY64 ASAH1:Q13510 
     "down"   "down"   "down"   "down"   "down"   "down" 
    HADHSC:NONAME FAM84B:Q96KN1  ADH5:P11766  NTN4:Q9HB63  AK3:Q9UIJ7 MTUS1:NONAME 
     "down"   "down"   "down"   "down"   "down"   "down" 
KIAA1815:NONAME 
     "down" 

MATRIX:

   Zhou2004 Zhou2006 Zhou2007 
CDC42:P60953 "up"  NA  NA  
CDK2D:NONAME "up"  NA  NA  
MAPK12:P53778 "down" NA  NA  
E2F3:NONAME  "down" NA  NA  
GRB2:P62424  "down" NA  NA  
GRB2:P62993  "down" NA  NA  
RFA:NONAME  "down" NA  NA  
CDK9:P50750  "down" NA  NA  
JUP/DP3:NONAME "down" NA  NA  
MEK1:NONAME  "down" NA  NA  
RFC38:NONAME "down" NA  NA  
DP2:NONAME  "down" NA  NA  
RFC37:NONAME "down" NA  NA  
GADD45:NONAME "down" NA  NA  
CTTN:Q14247  NA  "up"  "up"  
GTSE1:Q9NYZ3 NA  "up"  "up"  
CHST11:Q9N  NA  "up"  "up"  
CHST11:PF2  NA  "up"  "up"  

usw. (es würde mehr Reihen sein)

+0

Bitte fügen Sie einige Beispieldaten als Eingabe und die erwartete Ausgabe hinzu. – Chase

+1

können Sie 'dput' die Beispieldaten zu erleichtern, in einfügen? – James

Antwort

2

Beginnend mit @ flodel der Abtastdaten,

my.list <- list() 
my.list[["Zhou_et_al_2004"]]["CDC42:P60953"] <- 1 
my.list[["Zhou_et_al_2004"]]["CDK2D:NONAME"] <- 2 
my.list[["Zhou_et_al_2006"]]["CTTN:Q14247"] <- 3 
my.list[["Zhou_et_al_2006"]]["GTSE1:Q9NYZ3"] <- 4 
my.list[["Zhou_et_al_2006"]]["CHST11:Q9N"] <- 5 
my.list[["Zhou_et_al_2009"]]["CTTN:Q14247"] <- 6 

machen jedes Element der Liste, in einen Datenrahmen,

a <- lapply(seq_along(my.list), function(i) { 
    x <- my.list[[i]] 
    out <- data.frame(name=names(x), out=x) 
    names(out)[2] <- names(my.list)[[i]] 
    out 
}) 

verschmelzen alle Daten zusammen Rahmen,

out <- Reduce(function(x,y) { merge(x, y, all=TRUE) }, a) 

und repariere die rownames.

rownames(out) <- out[,1] 
out <- out[,-1] 

Hier ist das Ergebnis!

> out 
      Zhou_et_al_2004 Zhou_et_al_2006 Zhou_et_al_2009 
CDC42:P60953    1    NA    NA 
CDK2D:NONAME    2    NA    NA 
CHST11:Q9N    NA    5    NA 
CTTN:Q14247    NA    3    6 
GTSE1:Q9NYZ3    NA    4    NA 
+0

Dank! Das hat perfekt funktioniert – JoshDG

4

ldply vom plyr Paket ist besonders nützlich, für diese Art von Aufgabe. Vom doc:

Die eindeutige Verhalten wird erreicht, wenn .fun einen Datenrahmen gibt - in diesem Fall Stücke mit rbind.fill. *

kombiniert werden, wo rbind.fill diese komfortable Funktion Bindung data.frames ist und füllt fehlende Daten mit NA.

Also hier der Trick ist, eine Funktion anzuwenden, die Ihre Listenelemente in eine data.frame verwandelt:

my.list <- list() 
my.list[["Zhou_et_al_2004"]]["CDC42:P60953"] <- 1 
my.list[["Zhou_et_al_2004"]]["CDK2D:NONAME"] <- 2 
my.list[["Zhou_et_al_2006"]]["CTTN:Q14247"] <- 3 
my.list[["Zhou_et_al_2006"]]["GTSE1:Q9NYZ3"] <- 4 
my.list[["Zhou_et_al_2006"]]["CHST11:Q9N"] <- 5 

library(plyr) 
ldply(my.list, .fun = function(x)as.data.frame(as.list(x))) 
#    .id CDC42.P60953 CDK2D.NONAME CTTN.Q14247 GTSE1.Q9NYZ3 CHST11.Q9N 
# 1 Zhou_et_al_2004   1   2   NA   NA   NA 
# 2 Zhou_et_al_2006   NA   NA   3   4   5 

Ich vertraue darauf, Sie wissen, wie diese zu Ihrem endgültigen Format zu konvertieren.