R列表到稀疏矩阵

时间:2016-03-08 11:04:36

标签: r mongodb matrix sparse-matrix data-cleaning

我尝试使用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(),但都失败了。我不得不手动创建上面的数据框,以使问题清晰。

1 个答案:

答案 0 :(得分:3)

一个选项是来自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元素,将其转换为factorlevels指定为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") )