【问题标题】:Create a logical or binary matrix/data.frame from a list of factors in R从 R 中的因子列表创建逻辑或二进制矩阵/data.frame
【发布时间】:2016-12-19 12:06:30
【问题描述】:

我有一个包含大约 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)

【问题讨论】:

  • 您可能会在herehere 找到帮助,另一种选择是table(rep(seq_along(list1), lengths(list1)), unlist(list1))

标签: r list


【解决方案1】:

我们可以使用来自qdapToolsmtabulate

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

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2016-07-29
    相关资源
    最近更新 更多