【问题标题】:Merge vectors of different lengths to dynamic matrix将不同长度的向量合并到动态矩阵中
【发布时间】:2021-02-27 02:54:21
【问题描述】:

如何将 5 个向量合并为一个动态/灵活矩阵?

  V1 <- c(13, 31, 54)
  name1 <- c("a", "b2", "c")

  V2 <- c(17, 27, 34, 52)
  name2 <- c("a", "b1", "b2", "c")

  V3  <- c(19, 25, 33, 47, 58, 44)
  name3 <- c("a", "b1", "b2", "b3", "c", "d")

  V4  <- c(13, 29, 35, 56)
  name4 <- c("a", "b1", "b2", "c")

  V5<-c(21, 35, 67, 82, 96)
  name5<-c("d", "c", "b3", "b1", "b2")

然后创建一个这样的矩阵:

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我们可以使用mget 将对象加载到全局环境中,基于对象名称的pattern,即那些以(^) 'V' 开头的对象名称后跟一个或多个数字(\\d+ ) 在字符串的末尾 ($)。然后,根据listmaxlengths,在每个列表元素的末尾附加NA

    lst1 <- mget(ls(pattern = '^V\\d+$'))
    t(sapply(lst1, `length<-`, max(lengths(lst1))))
    

    如果我们也需要名字

    lst2 <- mget(ls(pattern = '^name\\d+$'))
    out <- xtabs(unlist(lst1) ~ rep(seq_along(lst1), lengths(lst1)) + 
             unlist(lst2))
    names(dimnames(out)) <- NULL
    

    或者另一个选项是来自purrrmap2

    library(purrr)    
    map2_dfr(lst1, lst2, setNames)
    

    -输出

    # A tibble: 5 x 6
    #     a    b2     c    b1    b3     d
    #  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #1    13    31    54    NA    NA    NA
    #2    17    34    52    27    NA    NA
    #3    19    33    58    25    47    44
    #4    13    35    56    29    NA    NA
    #5    NA    96    35    82    67    21
    

    【讨论】:

    • 我认为第一个选项没有给出预期的结果(不是指这里缺少的名称)。为第二个选项 +1。
    • .. 可能类似于 t(mapply(function(x, y) y[match(Reduce(union, lst2), x)], lst2, lst1))
    • @markus 谢谢。我在想Map 选项。 union optino 正在为我删除列名
    猜你喜欢
    • 2020-08-16
    • 2017-12-13
    • 2015-04-18
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多