R列表到稀疏矩阵

R list to sparse matrix

我尝试使用 R 从 mongodb 加载数据,但我发现查询结果是非结构化数据,这是一个混乱的列表,结果如下所示:

 df
[[1]]
list()
[[2]]
[[2]][[1]]
[1] "vector1"
[[2]][[2]]
[1] "vector2"
[[3]]
list()
[[4]]
list()
[[5]]
list()
[[6]]
[[6]][[1]]
[1] "vector1"
[[6]][[2]]
[1] "vector2"
[[6]][[3]]
[1] "vector3"

我试着将列表转换为矩阵,就像这样:

vector1 vector2 vector3
   0       0       0
   1       1       0
   0       0       0
   0       0       0
   0       0       0
   1       1       1 

我尝试使用SparseMatrix()sapply(),但都失败了。而且我不得不手动创建上面的数据框来弄清楚问题。

一个选项是 mtabulate 来自 qdapTools

library(qdapTools)
mtabulate(df)
#   vector1 vector2 vector3
#1       0       0       0
#2       1       1       0
#3       0       0       0
#4       0       0       0
#5       0       0       0
#6       1       1       1

或者如果我们需要一个 base R 选项,我们可以遍历 list 元素,将其转换为 factor 并指定 levels 作为 unique list 中的元素,用 table 获取频率,并转置 (t) 输出。

Un1 <- unique(unlist(df))
t(sapply(df, function(x) table(
              if(length(x)==0)
                 factor(x,levels = Un1) 
              else factor(unlist(x), levels=Un1))))
#     vector1 vector2 vector3
#[1,]       0       0       0
#[2,]       1       1       0
#[3,]       0       0       0
#[4,]       0       0       0
#[5,]       0       0       0
#[6,]       1       1       1

数据

df <- list(list(),  list("vector1", "vector2"), list(), 
      list(), list(), list("vector1", "vector2", "vector3") )