【问题标题】:rbind named vector to matrix with different lengthsrbind 命名向量到不同长度的矩阵
【发布时间】:2020-08-16 14:10:54
【问题描述】:

我正在尝试将一个命名向量绑定到一个矩阵上。命名向量的长度与矩阵不同:

> m <- matrix(data = c("1", "2", "3"), 
            nrow = 1, ncol = 3, 
            dimnames = list(c(), 
                            c("column 1", "column 2", "column 3")))

> named_vec <- c("4", "5")
> names(named_vec) <- c("column 1", "column 2")

> rbind(m, named_vec)

我得到以下信息:

Warning message:
In rbind(m, named_vec) :
  number of columns of result is not a multiple of vector length (arg 2)

这会产生重复较短向量的不良影响。
此外,plyr 的 rbind.fill 函数在这里不起作用,因为两个参数都需要是数据框:

> plyr::rbind.fill(data.frame(m), data.frame(named_vec))

Error: All inputs to rbind.fill must be data.frames

我想要的输出是一个用 NA 填充缺失值的矩阵,而不是重复向量,如下所示:

     column 1 column 2 column 3
[1,] "1"      "2"      "3"     
[2,] "4"      "5"      NA   

【问题讨论】:

    标签: r matrix vector rbind


    【解决方案1】:

    如果可以将矩阵转换为数据框,您可以使用bind_rows

    dplyr::bind_rows(data.frame(m), data.frame(t(named_vec)))
    
    #  column.1 column.2 column.3
    #1        1        2        3
    #2        4        5     <NA>
    

    【讨论】:

      【解决方案2】:

      下面是一个基本的 R 解决方案

      do.call(rbind,lapply(u<-list(m,named_vec),`length<-`,max(lengths(u))))
      

      这样

           column 1 column 2 column 3
      [1,] "1"      "2"      "3"     
      [2,] "4"      "5"      NA     
      

      【讨论】:

      • 这很好用,在使用 microbenchmark 之后,我确认它也是我的应用程序中最快的答案。谢谢!
      【解决方案3】:

      我们可以使用rbindlist

      library(data.table)
      rbindlist(list(as.data.frame(m), as.data.frame(t(named_vec))), fill = TRUE)
      

      【讨论】:

      • 感谢您的意见。这给了我想要的结果,但我必须先指定fill = T
      • @AlexW 抱歉,是的,如果列名不相似,则需要 fill = TRUE
      猜你喜欢
      • 1970-01-01
      • 2018-12-31
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      相关资源
      最近更新 更多