【问题标题】:Insert list of vectors in matrix by matching names in R通过匹配R中的名称在矩阵中插入向量列表
【发布时间】:2019-10-31 13:13:40
【问题描述】:

我有大量带有名称和值的向量。需要通过将列表中的向量名称与矩阵的列名称匹配来将向量的值添加到矩阵中。

例如向量和矩阵的列表如下:

## list
vec1 <- c(1.0, 3.3, 5.5)
names(vec1) <- c("v1", "v3", "v5")
vec2 <- c(2.0, 1.3, 5.0)
names(vec2) <- c("v3", "v5", "v10")
list_vec <- list(vec1, vec2)

## matrix
mat0 <- matrix(0, nrow = 10, ncol = 100) 
colnames(mat0) <- paste("v", 1:ncol(mat0), sep = "")

输出应该是矩阵第一行的vec1和矩阵第二行的vec2

【问题讨论】:

  • 试试mat0[1,names(vec1)] &lt;- vec1mat0[2,names(vec2)] &lt;- vec2?

标签: r matrix


【解决方案1】:

如果您使用的是Rbase 包,也许以下内容会有所帮助:

r <- do.call(rbind, lapply(seq(length(list_vec)), function(k) {mat0[k,names(list_vec[[k]])] <- list_vec[[k]]; mat0[k,]}))

r <- rbind(t(sapply(seq(length(list_vec)), function(k) {mat0[k,names(list_vec[[k]])] <- list_vec[[k]]; mat0[k,]})))

【讨论】:

    【解决方案2】:

    在基础中使用Reduce()dplyr::bind_rows()

    library(dplyr)
    mat <- Reduce(bind_rows, list_vec)
    mat[is.na(mat)] <- 0
    mat
    
    # A tibble: 2 x 4
    #      v1    v3    v5   v10
    #   <dbl> <dbl> <dbl> <dbl>
    # 1     1   3.3   5.5     0
    # 2     0   2     1.3     5
    

    注意:不要在base中使用rbind(),因为它不考虑向量名称的匹配。

    【讨论】:

    • 太棒了。这是非常简单的一步。只是我以后可能需要删除 NA。谢谢。
    • @AbhijeetPatil 很抱歉忽略了这一点。我编辑我的答案以使 NA 为 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    相关资源
    最近更新 更多