【问题标题】:R How to combine two matrices by row name when they have different numbers of rowsR当它们具有不同的行数时如何按行名组合两个矩阵
【发布时间】:2014-09-09 16:13:26
【问题描述】:

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

我想将它们组合起来,但它们的尺寸不同(即我想将它们并排放置)

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

我想将其保留为矩阵格式

【问题讨论】:

  • 您是否尝试过 sqldf 包中的 merge 命令或 sqldf 命令?如果您对此感到满意,则后者会使用 sql 语法。

标签: r matrix merge


【解决方案1】:

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。其他改进。

【讨论】:

    【解决方案2】:

    这可能是一个重复的问题:Concatenating Matrices in R

    更多关于 rbind 和 cbind 的信息:http://stat.ethz.ch/R-manual/R-patched/library/base/html/cbind.html

    【讨论】:

    • 假设矩阵的第一列在某一点之前是等价的。如果它们不同,则绑定将不会返回所需的结果。
    • 第二个答案gdata::cbindx 有效。我们必须为这个问题找到一个 Hadley 解决方案。如果没有,他显然是偷懒了……
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 2014-05-04
    • 2016-11-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多