【问题标题】:how to cast a tibble to a sparse matrix如何将 tibble 转换为稀疏矩阵
【发布时间】:2018-10-17 03:44:29
【问题描述】:

考虑一下这个简单的小标题

> data_frame(col1 = c(1,2,3), col2 = c(3,2,NA))
# A tibble: 3 x 2
   col1  col2
  <dbl> <dbl>
1     1     3
2     2     2
3     3    NA

将其转换为稀疏矩阵的最有效方法是什么? 我尝试了类似的东西

> data_frame(col1 = c(1,2,3), col2 = c(3,2,NA)) %>% 
+   as(., 'sparseMatrix')
Error in as(from, "CsparseMatrix") : 
  no method or default for coercing “tbl_df” to “CsparseMatrix”

没有成功。按照建议尝试:

y <- purrr::reduce(cbind2, map(df, 'Matrix', sparse = TRUE))

也不行。

使用 tidyverse 有什么好主意吗? 谢谢!

【问题讨论】:

  • 我看到了,但我需要一个 tidyverse 解决方案。没有lapply
  • 您可以调整 lapply/Reduce 答案以改为使用 purrr::map/purrr::reduce。我对稀疏矩阵的经验很少,所以我不确定我得到的是否是你想要的。也许发布一个结果示例?
  • 谢谢,但您能否使其与 mapreduce 一起使用?
  • map(df, Matrix::Matrix, sparse = T) %&gt;% reduce(cbind2) 给我一个 2 列稀疏矩阵。就像我说的那样,我对稀疏矩阵知之甚少,我不确定你想要什么结果。为什么引号中有'Matrix'?你从哪里加载它?

标签: r dplyr sparse-matrix purrr


【解决方案1】:

这只是the bounty-awarded answer 到上面链接的帖子的翻译,从基础lapply/Reducepurrrmap/reduce。使用的上一个答案:

Reduce(cbind2, lapply(x[,-1], Matrix, sparse = TRUE))

其工作原理的部分原因在于数据框在技术上是列表,因此您可以使用map 来遍历数据框的列。这会产生两个稀疏矩阵,每列一个:

library(dplyr)
library(purrr)

df <- data_frame(col1 = c(1,2,3), col2 = c(3,2,NA))

map(df, Matrix::Matrix, sparse = T)
#> $col1
#> 3 x 1 sparse Matrix of class "dgCMatrix"
#>       
#> [1,] 1
#> [2,] 2
#> [3,] 3
#> 
#> $col2
#> 3 x 1 sparse Matrix of class "dgCMatrix"
#>        
#> [1,]  3
#> [2,]  2
#> [3,] NA

如果你然后用cbind2 减少它,你会得到一个单一的稀疏矩阵。

map(df, Matrix::Matrix, sparse = T) %>% 
  reduce(cbind2)
#> 3 x 2 sparse Matrix of class "dgCMatrix"
#>          
#> [1,] 1  3
#> [2,] 2  2
#> [3,] 3 NA

reprex package (v0.2.1) 于 2018 年 10 月 16 日创建

【讨论】:

  • 嘿,卡米尔,谢谢你! :) 我看到你也写了javascript。有什么好书可以推荐吗?我只想为我的网站添加一些很酷的效果,并解析 SVG 图表 :)
猜你喜欢
  • 2023-04-10
  • 2021-11-25
  • 2017-07-02
  • 2020-12-07
  • 2014-12-21
  • 2015-12-26
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多