2011-05-17 19 views
36

En el ejemplo siguiente, tengo dos conjuntos de datos (Z y A). Quiero fusionar o combinar estos conjuntos con los números de ILMN. Si no hay coincidencia, complete NA.Fusionar o combinar por nombres de filas

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

El resultado será la siguiente:

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

Respuesta

34

Uso match para devolver su vector deseado y, a continuación cbind a su matriz

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. Tenga cuidado que t es la función base R que se utiliza para transponer matrices. Al crear una variable llamada t, puede generar confusión en el código de flujo descendente.

+0

Su respuesta es muy útil gracias. Lo único es que mi código no da la salida correcta. Si solo tomo esto: z [, "símbolo"] [coincidencia (nombres de fila (t), nombres de fila (z))] se crea un factor con NA y símbolos, pero cuando hago cbind, el número de símbolo se reemplaza por un valor de rondom . ¿Alguien sabe que está mal? Gracias – Lisann

+2

Corrija el error en su PS. No sobreescribes la función 't'. Está creando confusión para los usuarios, pero los datos y las funciones se almacenan en diferentes lugares. Adelante, pruébelo: t <- matriz (1: 4, 2, 2); t (t) ... funciona. –

+0

¿Funciona esta solución para una unión externa? –

3

No es perfecto pero se aproxima:

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

el uso de combinar y cambiar el nombre de su t vector como TT (ver el PS de Andrie):

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

Ahora si desea trabajar con tramas de datos en lugar de matrices , esto podría incluso llegar a ser mucho más fácil:

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

se puede envolver respuesta -Andrie en una función genérica

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

Aquí, puede enlazar varios fotogramas clave como con rownames

Cuestiones relacionadas