Преобразование списка в матрицу бонального присутствия / отсутствия - PullRequest
1 голос
/ 19 апреля 2020

У меня есть список векторов символов:

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)))

И я хотел бы создать integer matrix, где столбцы - это уникальные значения по sets.list (sets.ids <- 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)

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Мы можем использовать mtabulate

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

или stack для двухколоночного data.frame, а затем с table из base R

+(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
1 голос
/ 19 апреля 2020

Мы считаем число элементов списка в sets.list, используя table после преобразования их в factor с levels как sets.ids.

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
...