1) 由于A 的行名是B 行名的子集,我们可以先按行名合并它们,创建m,然后根据B 创建 m2。我们还删除了merge 创建的Row.names 列。最后我们将B的行名转移到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。其他改进。