首页 文章

从R中的因子列表创建逻辑或二进制矩阵/ data.frame

提问于
浏览
1

我有一个大约200万个元素的列表 . 该列表由字符串向量组成 . 大约有50个不同的字符串,因此可以被认为是因素 . 字符串的向量是在1和50之间变化的不同长度(即字符串的总数) .

我想将列表转换为逻辑或二进制矩阵/ data.frame . 目前我的方法涉及lapply并且非常慢,我想知道是否有矢量化方法 .

require(dplyr); require(tidyr)
#create test data set
set.seed(123)
list1 <- list()
ListLength <-10
elementlength <- sample(1:5, ListLength, replace = TRUE )

for(i in 1:length(elementlength) ){
  list1[[i]] <- sample(letters[1:15], elementlength[i])
}

#Create data frame from list using lapply
lapply(list1, function(n){
  data.frame(type = n, value = TRUE) %>% 
    spread(., key = type, value )
}) %>% bind_rows()

我不知道是否有办法通过预分配数据框然后以某种方式填充它 .

Type <- unique(unlist(list1, use.names = FALSE))

#Create empty dataframe  
TypeMat <- data.frame(matrix(NA, 
                               ncol = length(Type), 
                               nrow = ListLength)) %>% 
  setNames(Type)

1 回答

  • 3

    我们可以使用 mtabulate 来自 qdapTools

    library(qdapTools)
    mtabulate(list1)!=0
    #     a     b     c     d     e     f     g     h     i     j     k     l     m     o
    #[1,] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
    #[2,] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE
    #[3,]  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    #[4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE
    #[5,] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE  TRUE
    #[6,] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    #[7,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE
    #[8,]  TRUE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE
    #[9,] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    #[10,]FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    

相关问题