我有两个矩阵,可能两个列相等,但行数不等(但希望解决方案可以推广到两个数量不等)。
我想要以下行为(使用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
答案 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