【问题标题】:R list to sparse matrixR列表到稀疏矩阵
【发布时间】:2016-03-08 11:04:36
【问题描述】:

我尝试使用 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(),但都失败了。而且我必须手动创建上面的数据框以明确问题。

【问题讨论】:

  • 有什么方法可以(更)更精确吗?您尝试加载的数据是什么样的?您使用哪些命令会抛出混乱的列表?您如何将列表执行到矩阵?你是什​​么意思你尝试使用sapply?您应该考虑这些问题并相应地修改您的问题。这样人们就可以帮助您 - 现在有无数种可能导致您出错:语法错误、错误命令等。简而言之:具体
  • 好的,我下次再精确一点!

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


【解决方案1】:

一个选项是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 中的unique 元素,使用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") )

【讨论】:

  • 这是一个很酷的技巧,lapply + rbindlist 会比转置大数据更快吗?
  • @Shape 是的,它可能适用于大型矩阵。
  • 我删除了我的答案,因为我排除了空案例,但如果你想要一个数据生成器,你可以去:df &lt;- lapply(1:100,function(x) as.list(sample(paste0('vector',1:3),sample(3:0,1))))
  • @Shape 谢谢,我正在尝试创建 OP 的示例
猜你喜欢
  • 2023-03-19
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多