【问题标题】:Binding matrices in R with unequal rowsR中的绑定矩阵与不相等的行
【发布时间】:2018-07-11 13:21:48
【问题描述】:

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

我想要以下行为(使用 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

我发现使用 plyr 包中的 rbind.fill 的不正当解决方案:

> 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

【问题讨论】:

    标签: r matrix data-binding


    【解决方案1】:

    我们可以从rowr使用cbind.fill

    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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 如果两个对象都是矩阵而不是 data.frames,你有什么可以工作的吗?抱歉,问题应该更明确。
      【解决方案3】:
       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
      

      【讨论】:

      • sapply 将创建一个矩阵,因此值将被强制转换为单一数据类型,例如如果列中有字符,它们将被转换为数字。如果您改用lapply,则可以避免此问题。
      • 适用于 data.frame,但当输入为矩阵时,行为完全不同。对不起,我应该在这个问题上更明确。不过投票给你!
      • 请看看它可能解决你的问题。reference
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      相关资源
      最近更新 更多