2011-05-17 71 views
36

在下面的例子中,我有兩個數據集(Z和A)。我想通過ILMN號碼合併或組合這些集合。如果沒有匹配,請填寫NA。rownames合併或合併

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

其結果將是這樣的:

   [,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 

回答

34

使用match,使其返回所需載體,然後cbind你的矩陣

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。 被警告t是用於轉置矩陣的基本R函數。通過創建一個名爲t的變量,它可能會導致您的下游代碼混淆。

+0

你的回答是非常有用的感謝。唯一的問題是我的代碼沒有給出正確的輸出。如果我只考慮這個:z [,「symbol」] [match(rownames(t),rownames(z))]一個因子是用NA和符號創建的,但是當我執行cbind時,符號數量被替換爲rondom值。有誰知道這是錯的?謝謝 – Lisann 2011-05-17 11:19:03

+2

請更正您的PS中的錯誤。你不會覆蓋't'功能。您正在爲用戶造成混淆,但數據和功能存儲在不同的地方。繼續,測試它:t < - 矩陣(1:4,2,2); t(t)...有效。 – 2011-05-17 12:13:42

+0

此解決方案是否適用於外連接? – 2016-09-09 13:22:43

3

並不完美,但接近:

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

使用合併和重命名你的T載體爲TT(見Andrie的PS):

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

現在,如果你將與dataframes代替矩陣工作,這甚至會變得更容易:

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

你可以用-Andrie答案爲通用功能

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

在這裏,你可以綁定rownames多幀的關鍵