R当行具有不同行数时,如何按行名组合两个矩阵

时间:2014-07-18 13:39:54

标签: r matrix merge

我有两个矩阵,请注意日期是字符,实际上是列和行名称

我想把它们组合起来,但它们的大小不同(即我想把它们并排放置)

矩阵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

我想将其保留为矩阵格式

2 个答案:

答案 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