2

我有

a <- matrix(c(1,3,4,2,2,6,3,1,6), nrow = 3, ncol=3, byrow=TRUE, dimnames = list(NULL, c("Apples", "Pears", "Oranges")))

  Pears Apples Oranges
1     1      3       4
2     2      2       6
3     3      1       6

b <- matrix(c(1,3,2,6,3,6), nrow = 3, ncol=2, byrow=TRUE, dimnames = list(NULL, c( "Pears", "Oranges")))

  Pears Oranges
1     1       4
2     2       6
3     3       6

我想合并它们以获得这样的结果:

 Pears Apples Oranges
1     1      3       4
2     2      2       6
3     3      1       6
4     1     Na       4
5     2     Na       6
6     3     Na       6

即,按列名将它们组合在一起,在第二帧缺少值的情况下留下 Na/s,对于较大矩阵 a、较小矩阵 b 的一般情况

rbind 不起作用, merge 做了一些奇怪的事情。我追求什么?我也可以使用内存效率最高的东西,因为这最终会被做很多次,有很多列名。

谢谢,

-N

编辑:当我最初询问时,我可能应该提到这一点,但我实际上想达到上面的确切效果,但有一些非常重要的警告:

我正在使用矩阵

第一个矩阵将始终包含比第二个矩阵更多的列名

我可能想从包 bigmemory 创建一个 big.matrix。

4

3 回答 3

5

这是一种更通用的方法,以防您有多个列a并且b需要添加:

b.toAdd <- setdiff (names(a), names(b))
if (length(b.toAdd))
  b[, b.toAdd] <- NA

a.toAdd <- setdiff (names(b), names(a))
if (length(a.toAdd))
  a[, a.toAdd] <- NA

rbind(a, b)

更新:

刚刚注意到您关于需要内存效率的评论。在这种情况下,您可能想要使用,data.table因为使用<-会创建不必要的副本。
data.tableistead 有一个:=效率明显更高的运算符。

library(data.table)
a <- data.table(a)
b <- data.table(b)


if (length(b.toAdd <- setdiff (names(a), names(b))))
    b[, c(b.toAdd) := NA]

if (length(a.toAdd <- setdiff (names(b), names(a))))
    a[, c(a.toAdd) := NA]

rbind(a, b, use.names=TRUE)

#    Pears Apples Oranges
# 1:     1      3       4
# 2:     2      2       6
# 3:     3      1       6
# 4:     1     NA       4
# 5:     2     NA       6
# 6:     3     NA       6

搜索 SO[r] data.table benchmarks以了解改进

于 2013-03-24T19:13:28.360 回答
3

你可以使用:

rbind(a, cbind(b, Apples=NA))
  Pears Apples Oranges
1     1      3       4
2     2      2       6
3     3      1       6
4     1     NA       4
5     2     NA       6
6     3     NA       6
于 2013-03-24T19:07:48.843 回答
1

不太确定你在追求什么,但你可以与添加的列合并(类似于 jmsinger 的回答):

merge(a, cbind(b, Apples=NA), all=TRUE)
##   Pears Apples Oranges
## 1     1      3       4
## 2     1     NA       4
## 3     2      2       6
## 4     2     NA       6
## 5     3      1       6
## 6     3     NA       6
于 2013-03-24T19:09:35.240 回答