我有
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不起作用,合并做了一些奇怪的事情。我在追求什么?我也可以使用内存效率最高的东西,因为这最终会被执行很多次,有很多列名。
谢谢,
-N
编辑:当我最初询问时,我可能应该提到这一点,但我实际上想要达到如上所述的确切效果,但有一些非常重要的警告:我正在使用矩阵
第一个矩阵将始终包含所有和更多的名称,而不是第二个
我可能想从包bigmemory创建一个big.matrix。
答案 0 :(得分: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.table
isntead有:=
运算符,效率明显提高。
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
以了解改进情况
答案 1 :(得分: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
答案 2 :(得分: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