R中的矩阵与不等行的绑定矩阵

时间:2018-02-01 09:11:19

标签: r matrix data-binding

我有两个矩阵,可能两个列相等,但行数不等(但希望解决方案可以推广到两个数量不等)。

我想要以下行为(使用data.frames演示):

x = data.frame(z = c(8, 9), w = c(10, 11))
y = data.frame(x = c(1, 2, 3), y = c(4, 5, 6))

> x
  z  w
1 8 10
2 9 11

> y
  x y
1 1 4
2 2 5
3 3 6

我想做一些像

这样的事情
magic_cbind(x, y)
   z   w  x  y
1  8  10  1  4
2  9  11  2  5
3 NA  NA  3  6

我使用rbind.fill包中的plyr找到了一个反常的解决方案:

> x = data.frame(t(x))
> y = data.frame(t(y))
> x
  X1 X2
z  8  9
w 10 11
> y
  X1 X2 X3
x  1  2  3
y  4  5  6
> rbind.fill(x, y)
  X1 X2 X3
1  8  9 NA
2 10 11 NA
3  1  2  3
4  4  5  6
> rbind.fill(x, y) %>% t %>% as.matrix %>% unname
     [,1] [,2] [,3] [,4]
[1,]    8   10    1    4
[2,]    9   11    2    5
[3,]   NA   NA    3    6

但我想知道是否有更优雅的解决方案?我事先并不知道矩阵的最终大小,这是一个问题,它在一个循环中增长(这是一种可怕的练习,但它已经变得足够大,实际上是一个问题)。也就是说,给定一个矩阵,我试图以上述方式将通过循环获得的其他列绑定到它。

我使用以下问题拼凑了我的解决方案:

Bind list with unequal columns

Combining (cbind) vectors of different length

R: column binding with unequal number of rows

3 个答案:

答案 0 :(得分:2)

我们可以使用cbind.fill

中的rowr
rowr::cbind.fill(x, y, fill = NA)
#    z  w x y
#1  8 10 1 4
#2  9 11 2 5
#3 NA NA 3 6

答案 1 :(得分:2)

这是基础R的一种方式:

as.data.frame(lapply(c(x,y),`length<-`,max(nrow(x),nrow(y))))

   z  w x y
1  8 10 1 4
2  9 11 2 5
3 NA NA 3 6

答案 2 :(得分:1)

 data.frame( sapply(c(x,y), '[', seq(max(lengths(c(x, y))))))


   z  w x y
1  8 10 1 4
2  9 11 2 5
3 NA NA 3 6

或使用

library(magrittr)

library(purrr)

map_df(c(x, y), extract, seq(max(lengths(c(x, y)))))

or 
map_df(c(x,y), `[`, seq(max(lengths(c(x, y)))))


# A tibble: 3 x 4
      z     w     x     y
  <dbl> <dbl> <dbl> <dbl>
1  8.00  10.0  1.00  4.00
2  9.00  11.0  2.00  5.00
3 NA     NA    3.00  6.00