我正在努力将两个不等长的矩阵组合在一起,跨越相同(或相似)的时间范围。我想根据时间维度将两个矩阵的信息合并为一个矩阵,在缺少第二个矩阵的信息的行上填充零。
在下面的例子中,我有一个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上。
答案 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而不是矩阵,然后将行名称包含在字符列中。然后,您就可以使用merge
或dplyr::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))