R:合并矩阵(不是数据帧)

R:合并矩阵(不是数据帧),r,R,merge是一个非常好的函数:它合并矩阵和data.frames,并返回data.frames 具有相当大的字符矩阵, 还有其他合并的好方法吗- 没有数据帧转换 评论1: 将命名向量与矩阵或data.frame合并的小函数。向量元素可以链接到矩阵中的多个条目: expand <- function(v,m,by.m,v.name='v',...) { df <- do.call(rbind,lapply(names(v),function(x) { pos <-

merge是一个非常好的函数:它合并矩阵和data.frames,并返回data.frames

具有相当大的字符矩阵, 还有其他合并的好方法吗- 没有数据帧转换


评论1: 将命名向量与矩阵或data.frame合并的小函数。向量元素可以链接到矩阵中的多个条目:

expand <- function(v,m,by.m,v.name='v',...) {
  df <- do.call(rbind,lapply(names(v),function(x) {
    pos <- which(m[,by.m] %in% v[x])
    cbind(x,m[pos,],...)
  }))
  colnames(df)[1] <- v.name
  df
}
expandNo,必须(a)覆盖合并函数或(b)创建新的
merge.matrix()
S3函数(这是解决问题的正确方法)

您可以在
合并
帮助中看到:

价值观

数据帧

另外,
merge.default
函数:

> merge.default
function (x, y, ...) 
merge(as.data.frame(x), as.data.frame(y), ...)

您可以使用match和cbind的组合来执行等效的合并,而无需转换为数据帧,一个简单的示例:

st1 <- state.x77[ sample(1:50), ]
st2 <- as.matrix( USArrests )[ sample(1:50), ]

tmp1 <- match(rownames(st1), rownames(st2) )

st3 <- cbind( st1, st2[tmp1,] )
head(st3)

st1现在在
Matrix.utils
包中有一个
merge.Matrix
函数。这适用于矩阵组合以及大写M矩阵、数据帧等


匹配解决方案很好,但正如有人指出的那样,不适用于m:n关系。它也没有实现
merge
的其他功能,包括
all.x
all.y
,等等。

您不是只需要
cbind
rbind
?不,它们是不够的:当有m:n关系时,它们不会正确地展开/合并是,我喜欢在泛型的
merge()
函数中添加方法的想法。是的,这可能是实现矩阵合并最简单的方法,您可能可以创建一个函数,将公共列合并到可以应用
match()的键字符串中
如果要合并的列超过1列,则可以使用。match()和%in%进行合并。谢谢。您也可以直接按row.names合并<代码>合并(x,y,by=“row.names”)
。更多信息
st1 <- state.x77[ sample(1:50), ]
st2 <- as.matrix( USArrests )[ sample(1:50), ]

tmp1 <- match(rownames(st1), rownames(st2) )

st3 <- cbind( st1, st2[tmp1,] )
head(st3)