R:合并矩阵(不是data.frames)

时间:2010-09-15 12:53:12

标签: r

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

  

拥有相当大的角色矩阵,   还有另一种合并方式 -   没有data.frame转换?


评论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
}

示例:

v <- rep(letters,each=3)[seq_along(letters)]
names(v) <- letters
m <- data.frame(a=unique(v),b=seq_along(unique(v)),stringsAsFactors=F)
expand(v,m,'a')

3 个答案:

答案 0 :(得分:8)

您可以使用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)

跟踪您想要的列,并在一个组中合并多个1个关系或缺少行需要更多考虑,但仍然可以。

答案 1 :(得分:3)

不,不是没有(a)覆盖合并功能或(b)创建新的merge.matrix() S3功能(这将是解决问题的正确方法)。

您可以在merge帮助中看到:

  

     

数据框。

此外,merge.default功能:

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

答案 2 :(得分:2)

merge.Matrix包中现在有Matrix.utils个功能。这适用于矩阵以及大写M矩阵,data.frames等的组合。

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