我有两个矩阵,请注意日期是字符,实际上是列和行名称
我想把它们组合起来,但它们的大小不同(即我想把它们并排放置)
矩阵A:
04/06/2012 11/06/2012
26/03/2012 10 11
02/04/2012 9 10
09/04/2012 8 9
16/04/2012 7 8
23/04/2012 6 7
30/04/2012 5 6
矩阵B:
18/06/2012 25/06/2012
26/03/2012 12 13
02/04/2012 11 12
09/04/2012 10 11
16/04/2012 9 10
23/04/2012 8 9
30/04/2012 7 8
07/05/2012 6 7
14/05/2012 5 6
21/05/2012 4 5
28/05/2012 3 4
期望的输出:
04/06/2012 11/06/2012 18/06/2012 25/06/2012
26/03/2012 10 11 12 13
02/04/2012 9 10 11 12
09/04/2012 8 9 10 11
16/04/2012 7 8 9 10
23/04/2012 6 7 8 9
30/04/2012 5 6 7 8
07/05/2012 NA NA 6 7
14/05/2012 NA NA 5 6
21/05/2012 NA NA 4 5
28/05/2012 NA NA 3 4
我想将其保留为矩阵格式
答案 0 :(得分:3)
1)由于A
的行名称是B
的行名称的子集,我们可以先按行名创建m
并将它们合并然后根据B
创建m2
对行重新排序。我们还会删除Row.names
创建的merge
列。最后,我们将B
的rownames转移到m2
:
m <- merge(A, B, by = 0, all = TRUE)
m2 <- m[match(rownames(B), m[, "Row.names"]), -1]
rownames(m2) <- rownames(B)
,并提供:
> m2
04/06/2012 11/06/2012 18/06/2012 25/06/2012
26/03/2012 10 11 12 13
02/04/2012 9 10 11 12
09/04/2012 8 9 10 11
16/04/2012 7 8 9 10
23/04/2012 6 7 8 9
30/04/2012 5 6 7 8
07/05/2012 NA NA 6 7
14/05/2012 NA NA 5 6
21/05/2012 NA NA 4 5
28/05/2012 NA NA 3 4
1a)认识到真正的问题是行名称不在不能正确排序的表示中,如果我们重新格式化日期以便它们进行排序,这可以简化为只是合并。 merge
创建一个带有Row.names
列的data.frame,我们将其更改回矩阵:
# reformat Dates so that they sort
refmt <- function(x) format(as.Date(chartr(".", "/", x), "%d/%m/%Y"))
A2 <- A; dimnames(A2) <- lapply(dimnames(A2), refmt)
B2 <- B; dimnames(B2) <- lapply(dimnames(B2), refmt)
ABdf <- merge(A2, B2, by = 0, all = TRUE, suffixes = "")
# convert back to matrix
AB <- as.matrix(ABdf[, -1])
rownames(AB) <- ABdf$Row.names
,并提供:
> AB
2012-06-04 2012-06-11 2012-06-18 2012-06-25
2012-03-26 10 11 12 13
2012-04-02 9 10 11 12
2012-04-09 8 9 10 11
2012-04-16 7 8 9 10
2012-04-23 6 7 8 9
2012-04-30 5 6 7 8
2012-05-07 NA NA 6 7
2012-05-14 NA NA 5 6
2012-05-21 NA NA 4 5
2012-05-28 NA NA 3 4
2)另一种方法是将矩阵转换为zoo对象,合并它们并创建更好的列名:
library(zoo)
fmt <- "%d/%m/%Y"
Az <- zoo(A, as.Date(rownames(A), fmt))
Bz <- zoo(A, as.Date(rownames(B), fmt))
ABz <- merge(Az, Bz, all = TRUE)
# optionally make nicer column dates
colnames(ABz) <- format(as.Date(c(colnames(Az), colnames(Bz)), "%d.%m.%Y"))
给动物园对象:
> ABz
2012-06-04 2012-06-11 2012-06-04 2012-06-11
2012-03-26 10 11 10 11
2012-04-02 9 10 9 10
2012-04-09 8 9 8 9
2012-04-16 7 8 7 8
2012-04-23 6 7 6 7
2012-04-30 5 6 5 6
2012-05-07 NA NA 10 11
2012-05-14 NA NA 9 10
2012-05-21 NA NA 8 9
2012-05-28 NA NA 7 8
可以选择将其转换回如下矩阵:
m <- coredata(ABz)
rownames(m) <- format(time(ABz))
虽然我们可能只想将它保留为动物园对象,以方便其他时间序列操作。
更新已添加1a和2.其他改进。
答案 1 :(得分:0)
这可能是一个重复的问题:Concatenating Matrices in R
有关rbind和cbind的更多信息:http://stat.ethz.ch/R-manual/R-patched/library/base/html/cbind.html