R 按列名合并

R 按列名合并,r,matrix,merge,R,Matrix,Merge,我有 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),

我有

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
也就是说,在第二帧缺少值的情况下,按列名将它们组合起来,留下Na/s,对于矩阵a越大,矩阵b越小的一般情况

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

谢谢

-N

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

我用的是矩阵

第一个矩阵总是包含比第二个矩阵更多的所有colname

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

您可以使用:

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

不太清楚您想要的是什么,但您可以与添加的列合并(类似于jmsinger的答案):


这里有一种更通用的方法,如果您在
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)


搜索
[r]data.table benchmarks
了解改进的想法

谢谢,但正如我编辑时提到的,我使用的是矩阵,这对它们不起作用。我将names()更改为colnames(),但在b[,b.toAdd]@N.McA中出现错误。这个答案的第二部分应该仍然有效。(也就是说,使用
a right,但我最终需要使用bigmemory…或者data.tables允许我使用文件备份对象吗?好的,不。然而,
:=
背后的想法是不必为了添加列而复制整个对象。因此,对内存的需求会减少,并且可能不需要r昂贵的文件I/O。最好的确定方法是实验。这种方法似乎也在某种程度上给我的数据添加布尔值?我在实验:P
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
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)
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