【问题标题】:Dynamic matrix from vectors来自向量的动态矩阵
【发布时间】:2020-12-08 12:05:51
【问题描述】:

从这些向量创建动态矩阵时

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")
names(V1) <- name1
names(V2) <- name2
names(V3) <- name3
names(V4) <- name4
names(V5) <- name5

并使用此代码创建矩阵

lst1 <- mget(ls(pattern = '^V\\d+$'))
t(sapply(lst1, `length<-`, max(lengths(lst1))))
lst2 <- mget(ls(pattern = '^name\\d+$'))
library(purrr)    
map2_dfr(lst1, lst2, setNames)

如何在不改变矩阵结构的情况下添加如下图所示带有向量名称的列?

【问题讨论】:

  • 很抱歉,我没有正确添加代码 - 它现在应该在那里(但我有点不在我这里,所以我不能 100% 确定它是正确的完成

标签: r matrix purrr


【解决方案1】:

您可以使用 ls 参数来捕获变量并分配行名。

result <- data.frame(purrr::map2_dfr(lst1, lst2, setNames))
rownames(result) <- ls(pattern = '^V\\d+$')
result

#    a b2  c b1 b3  d
#V1 13 31 54 NA NA NA
#V2 17 34 52 27 NA NA
#V3 19 33 58 25 47 44
#V4 13 35 56 29 NA NA
#V5 NA 96 35 82 67 21

【讨论】:

  • 非常感谢!它帮助我更好地理解它
【解决方案2】:

我们也可以使用bind_rows

library(dplyr)
`row.names<-`(as.data.frame(bind_rows(Map(setNames, lst1, lst2))), 
          ls(pattern = '^V\\d+$'))
#   a b2  c b1 b3  d
#V1 13 31 54 NA NA NA
#V2 17 34 52 27 NA NA
#V3 19 33 58 25 47 44
#V4 13 35 56 29 NA NA
#V5 NA 96 35 82 67 21

【讨论】:

    【解决方案3】:

    作为替代方案,您只需几个步骤即可直接从lst1 转到矩阵。 lst2 不是必需的。

    lst1 <- mget(ls(pattern = '^V\\d+$'))
    
    # For column names
    col <- unlist(sapply(lst1, names), use.names=FALSE)
    
    # An empty matrix. 
    # Rows are named after each list item
    # Columns are the unique values from "col"
    m <- matrix(NA, nrow = length(lst1), ncol = length(unique(col)), 
                dimnames = list(names(lst1), unique(col)))
    
    # Using the lengths of each list to identify the rows,
    # and matching col with unique column names, 
    # fill in the values by unlisting your list
    m[cbind(rep(seq_along(lst1), lengths(lst1)), 
      match(col, colnames(m)))] <- unlist(lst1, use.names=FALSE)
    #     a b2  c b1 b3  d
    # V1 13 31 54 NA NA NA
    # V2 17 34 52 27 NA NA
    # V3 19 33 58 25 47 44
    # V4 13 35 56 29 NA NA
    # V5 NA 96 35 82 67 21
    

    【讨论】: