在下面的示例中,我有两个数据集(Z和A)。我想通过ILMN号码合并或组合这些集合。如果没有匹配,请填写NA。
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
答案 0 :(得分:55)
使用合并并将t向量重命名为tt(参见Andrie的PS):
merge(tt,z,by="row.names",all.x=TRUE)[,-(5:8)]
现在,如果你使用数据帧而不是矩阵,这甚至可以变得更容易:
z <- as.data.frame(z)
tt <- as.data.frame(tt)
merge(tt,z["symbol"],by="row.names",all.x=TRUE)
答案 1 :(得分:37)
使用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的变量,可能会导致下游代码混淆。
答案 2 :(得分:3)
不完美但很接近:
newcol<-sapply(rownames(t), function(rn){z[match(rn, rownames(z)), 5]})
cbind(data.frame(t), newcol)
答案 3 :(得分: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)
}
答案 4 :(得分:1)
你可以将-Andrie答案包装成通用函数
mbind<-function(...){
Reduce( function(x,y){cbind(x,y[match(row.names(x),row.names(y)),])}, list(...) )
}
在这里,您可以使用rownames作为键
绑定多个帧