R:组合两个长度不等的矩阵/向量,根据相同的值匹配行

时间:2016-06-10 09:46:03

标签: r matrix merge dplyr bind

我正在努力将两个不等长的矩阵组合在一起,跨越相同(或相似)的时间范围。我想根据时间维度将两个矩阵的信息合并为一个矩阵,在缺少第二个矩阵的信息的行上填充零。

在下面的例子中,我有一个5x2和3x1矩阵,其rownames等于相应的时间。

输入1

                   [,1] [,2]
20160518  15:31:00    1    1
20160518  15:32:00    2    1
20160518  15:33:00    3    1
20160518  15:34:00    4    1
20160518  15:35:00    5    1

输入2

                  [,1]                      
20160518  15:31:00 100
20160518  15:34:00 101
20160518  15:35:00 102

期望的结果

                   [,1] [,2] [,3]
20160518  15:31:00    1    1  100
20160518  15:32:00    2    1    0
20160518  15:33:00    3    1    0
20160518  15:34:00    4    1  101
20160518  15:35:00    5    1  102

第二个问题非常相似。现在不是根据相同的rownames进行匹配,而是根据向量中的相同值进行匹配。即想象一下rownames是给定矩阵的一个单独的列(所以我有一个5x3和3x2矩阵),我想按照与上面相同的逻辑将它们组合成一个。

我真的很感谢你的帮助。我搜索了很多个小时才找到解决方案。我尝试了各种merge,cbind和dplyr包命令。我可能错过了一点点,但我无法弄清楚。最接近的主题是(但我仍然无法根据我的问题进行定制):

combining two data frames of different lengths

最佳, P上。

2 个答案:

答案 0 :(得分:0)

如果你的rownames设置得很好,很独特,等等......你可以这样做:

input3 <- input2[rownames (input1),] # reorder input2 as input1  
missing <- is.na (input3[,1])        # find the missing values
input3[missing,1] <- 0               # replace by 1
cbind (input1, input3)               # combine

关于第二个问题,您始终可以使用要重命名行名的列...(如果您需要使用多个列作为行的唯一标识符,请使用paste

除了上述解决方案之外,你可以使用data.frames而不是矩阵,然后将行名称包含在字符列中。然后,您就可以使用mergedplyr::full_join等函数。

答案 1 :(得分:0)

在我看来,你应该使用数据框而不是矩阵。矩阵意味着与数值数据一起使用,而在这里你有数字和分类数据的混合。

> x <- cbind(t=rownames(x), as.data.frame(unname(x)))
> y <- cbind(t=rownames(y), as.data.frame(unname(y)))
> xy <- merge(x, y, by='t', all=TRUE)
> xy[is.na(xy)] <- 0
> xy
                   t V1.x V2 V1.y
1 20160518  15:31:00    1  1  100
2 20160518  15:32:00    2  1    0
3 20160518  15:33:00    3  1    0
4 20160518  15:34:00    4  1  101
5 20160518  15:35:00    5  1  102

然后,如果你真的想要矩阵形式的结果,你可以做到 as.matrix(xy[-1])

数据:

x <- structure(c(1L, 2L, 3L, 4L, 5L, 1L, 1L, 1L, 1L, 1L),
               .Dim = c(5L, 2L),
               .Dimnames = list(c("20160518  15:31:00",
                                  "20160518  15:32:00",
                                  "20160518  15:33:00",
                                  "20160518  15:34:00",
                                  "20160518  15:35:00"), NULL))

y <- structure(100:102, .Dim = c(3L, 1L),
               .Dimnames = list(c("20160518  15:31:00",
                                  "20160518  15:34:00",
                                  "20160518  15:35:00"), NULL))