【问题标题】:Convert a list into a bonary presence/absence matrix将列表转换为二进制存在/不存在矩阵
【发布时间】:2020-08-01 12:11:16
【问题描述】:

我有一个字符向量列表:

set.seed(1)
sets.list <- list(s1 = paste0("id",sample(1:10,3,replace=F)),
                  s2 = paste0("id",sample(1:10,4,replace=F)),
                  s3 = paste0("id",sample(1:10,4,replace=F)))

我想创建一个integermatrix,其中列是sets.list (sets.ids &lt;- unique(unlist(sets.list))) 中的唯一值,行是sets.list 元素,值是值是否是 sets.list 元素的成员 (1) 或不是 (0)。

这就是我当前生成此matrix 的方式:

sets.mat <- do.call(rbind,lapply(sets.list, function(s){
  set.row <- rep(0,length(sets.ids))
  set.row[which(sets.ids %in% s)] <- 1
  return(set.row)
}))

colnames(sets.mat) <- sets.ids

我的问题是在代码方面是否有更简洁的东西(也许使用tidyverse

【问题讨论】:

    标签: r list matrix dplyr tidyverse


    【解决方案1】:

    我们可以使用mtabulate

    library(qdapTools)
    as.matrix(mtabulate(sets.list))
    

    stack 将其转换为两列 data.frame,然后使用来自 base Rtable

    +(table(stack(sets.list)[2:1]) > 0)
    #  values
    #ind  id1 id2 id3 id4 id5 id7 id9
    #  s1   0   0   0   1   0   1   1
    #  s2   1   1   0   0   1   1   0
    #  s3   1   1   1   0   1   0   0
    

    【讨论】:

    • 我将%&gt;% data.matrix() 添加到mtabulate 选项,以便它返回matrix
    【解决方案2】:

    在将levels 转换为factorsets.ids 之后,我们使用table 计算sets.list 中每个列表元素的出现次数。

    t(sapply(sets.list, function(x) table(factor(x, levels = sets.ids))))
    
    #   id9 id4 id7 id1 id2 id5 id3
    #s1   1   1   1   0   0   0   0
    #s2   0   0   1   1   1   1   0
    #s3   0   0   0   1   1   1   1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-23
      • 2015-06-01
      • 2020-04-21
      • 1970-01-01
      • 2021-09-09
      • 2019-05-02
      • 1970-01-01
      • 2015-05-13
      相关资源
      最近更新 更多