【问题标题】:Fill matrix from list based on column name match from other list根据来自其他列表的列名匹配从列表中填充矩阵
【发布时间】:2016-09-13 20:30:30
【问题描述】:

我有一些数据:

num.list1 <- list(1,2,1,4,5)
num.list2 <- list(2,3)
num.list3 <- list(3,5,2)

num.data.list <- list(num.list1, num.list2, num.list3)

name.list1 <- list("A","B","C","D","E")
name.list2 <- list("B","C")
name.list3 <- list("A","C","E")

name.data.list <- list(name.list1, name.list2, name.list3)

all.names <- unique(unlist(name.data.list))

my.matrix <- matrix(data = NA, nrow = length(name.data.list), ncol =     length(all.names))

colnames(my.matrix) <- all.names

我想根据my.matrix 的列名与name.data.list 中的值匹配,用num.data.list 中的值填充my.matrix

即:

      A    B    C    D    E

1     1    2    1    4    5  

2     NA   2    3    NA   NA

3     3    NA   5   NA    2

有什么想法吗?谢谢。

【问题讨论】:

  • 我会从unlist()开始。为什么要使用嵌套列表来保存单个值?
  • @RichardScriven:这是一种简化。在真实数据中,每个列表都是从大量多变量数据中提取的。
  • @mattbawn 不要以为你回答了理查德的问题。为什么num.list.1list 而不是标准的数字向量?它的每个元素的长度为 1; list 结构不适合这种对象。
  • @nicola 是的,您可能是对的,但在我的真实数据中,每个列表都包含不同长度的数字数据。谢谢。

标签: r list matrix


【解决方案1】:

使用矩阵子集:

library(reshape2)

nm = melt(name.data.list)

my.matrix[matrix(c(nm$L1, match(nm$value, all.names)), ncol = 2)] = unlist(num.data.list)
#      A  B C  D  E
#[1,]  1  2 1  4  5
#[2,] NA  2 3 NA NA
#[3,]  3 NA 5 NA  2

【讨论】:

    【解决方案2】:

    我会开始给num.data.listname.data.list 提供正确的结构:

    num.data.list<-lapply(num.data.list,unlist)
    name.data.list<-lapply(name.data.list,unlist)
    

    然后:

    for (i in 1:nrow(my.matrix)) my.matrix[i,name.data.list[[i]]]<-num.data.list[[i]]
    my.matrix
    #      A  B C  D  E
    #[1,]  1  2 1  4  5
    #[2,] NA  2 3 NA NA
    #[3,]  3 NA 5 NA  2
    

    【讨论】:

      【解决方案3】:

      这是您可以使用Maprbindlist 函数执行的另一个选项,假设您的名称和数据的顺序是num.data.list 中的每个元素都与name.data.list 中的相应元素匹配。

      library(data.table);
      
      rbindlist(Map(function(x, y) setNames(data.frame(x), y), 
                num.data.list, name.data.list), fill = T)
          A  B C  D  E
      1:  1  2 1  4  5
      2: NA  2 3 NA NA
      3:  3 NA 5 NA  2
      

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多