2011-05-17 25 views
36

Aşağıdaki örnekte iki veri kümem var (Z ve A). Bu setleri ILMN sayılarıyla birleştirmek veya birleştirmek istiyorum. Eşleşme yoksa, NA'yı doldurun.Rownames tarafından birleştirme ya da birleştirme

z <- matrix(c(0,0,1,1,0,0,1,1,0,0,0,0,1,0,1,1,0,1,1,1,1,0,0,0,"RND1","WDR", "PLAC8","TYBSA","GRA","TAF"), nrow=6, 
    dimnames=list(c("ILMN_1651838","ILMN_1652371","ILMN_1652464","ILMN_1652952","ILMN_1653026","ILMN_1653103"),c("A","B","C","D","symbol"))) 

t<-matrix(c("GO:0002009", 8, 342, 1, 0.07, 0.679, 0, 0, 1, 0, 
     "GO:0030334", 6, 343, 1, 0.07, 0.065, 0, 0, 1, 0, 
     "GO:0015674", 7, 350, 1, 0.07, 0.065, 1, 0, 0, 0), nrow=10, dimnames= list(c("GO.ID","LEVEL","Annotated","Significant","Expected","resultFisher","ILMN_1652464","ILMN_1651838","ILMN_1711311","ILMN_1653026"))) 

sonuç böyle olacaktır:

   [,1]   [,2]   [,3]   [,4] 
GO.ID  "GO:0002009" "GO:0030334" "GO:0015674" NA 
LEVEL  "8"   "6"   "7"   NA 
Annotated "342"  "343"  "350"   NA 
Significant "1"   "1"   "1"   NA 
Expected  "0.07"  "0.07"  "0.07"  NA 
resultFisher "0.679"  "0.065"  "0.065"  NA 
ILMN_1652464 "0"   "0"   "1"   PLAC8 
ILMN_1651838 "0"   "0"   "0"   RND1 
ILMN_1711311 "1"   "1"   "0"   NA 
ILMN_1653026 "0"   "0"   "0"   GRA 

cevap

34

kullanın match sizin matris

cbind(t, z[, "symbol"][match(rownames(t), rownames(z))]) 

      [,1]   [,2]   [,3]   [,4] 
GO.ID  "GO:0002009" "GO:0030334" "GO:0015674" NA  
LEVEL  "8"   "6"   "7"   NA  
Annotated "342"  "343"  "350"  NA  
Significant "1"   "1"   "1"   NA  
Expected  "0.07"  "0.07"  "0.07"  NA  
resultFisher "0.679"  "0.065"  "0.065"  NA  
ILMN_1652464 "0"   "0"   "1"   "PLAC8" 
ILMN_1651838 "0"   "0"   "0"   "RND1" 
ILMN_1711311 "1"   "1"   "0"   NA  
ILMN_1653026 "0"   "0"   "0"   "GRA" 

PS, sonra bunu cbind istediğiniz vektörü dönmek için. , t matrislerini aktarmak için kullanılan temel R işlevi olduğu konusunda uyarılırsınız. T olarak adlandırılan bir değişken oluşturarak, aşağı akış kodunuzda karışıklığa yol açabilir. yakın

+0

olarak rownames ile birden fazla kare bağlayabilir,

mbind<-function(...){ Reduce(function(x,y){cbind(x,y[match(row.names(x),row.names(y)),])}, list(...)) } 

İşte jenerik fonksiyonu içine -Andrie cevabı sarabilirsiniz. Tek sorun, kodumun hizalı çıkışı vermemesi. Bunu sadece alırsam: z [, "sembol"] [eşleşme (rownames (t), rownames (z))] NA ve sembollerle bir faktör yaratılır, fakat cbindiğimde sembol numarası bir rondom değeriyle değiştirilir. . Bunun yanlış olduğunu bilen var mı? Teşekkürler – Lisann

+2

Lütfen PS'nizdeki hatayı düzeltin. 'T' fonksiyonunun üzerine _not_. Kullanıcılar için karışıklık yaratıyorsunuz, ancak veri ve işlevler farklı yerlerde saklanıyor. Devam et, test et: t <- matris (1: 4, 2, 2); t (t) ... çalışır. –

+0

Bu çözüm bir dış birleştirmede çalışıyor mu? –

3

Mükemmel değil ama:

newcol<-sapply(rownames(t), function(rn){z[match(rn, rownames(z)), 5]}) 
cbind(data.frame(t), newcol) 
40

birleştirme kullanma ve tt gibi t vektörü (ANDRIE ait PS bakınız) yeniden adlandırma: Eğer dataframes yerine matrisleri ile çalışacak Şimdi eğer

merge(tt,z,by="row.names",all.x=TRUE)[,-(5:8)] 

Bu bile çok daha kolay olacaktı:

z <- as.data.frame(z) 
tt <- as.data.frame(tt) 
merge(tt,z["symbol"],by="row.names",all.x=TRUE) 
1
cbind.fill <- function(x, y){ 
    xrn <- rownames(x) 
    yrn <- rownames(y) 
    rn <- union(xrn, yrn) 
    xcn <- colnames(x) 
    ycn <- colnames(y) 
    if(is.null(xrn) | is.null(yrn) | is.null(xcn) | is.null(ycn)) 
    stop("NULL rownames or colnames") 
    z <- matrix(NA, nrow=length(rn), ncol=length(xcn)+length(ycn)) 
    rownames(z) <- rn 
    colnames(z) <- c(xcn, ycn) 
    idx <- match(rn, xrn) 
    z[!is.na(idx), 1:length(xcn)] <- x[na.omit(idx),] 
    idy <- match(rn, yrn) 
    z[!is.na(idy), length(xcn)+(1:length(ycn))] <- y[na.omit(idy),] 
    return(z) 
} 
1

Eğer Cevabınız teşekkür ederim çok yararlıdır anahtar

İlgili konular