【问题标题】:How to create sparse Matrix in R如何在 R 中创建稀疏矩阵
【发布时间】:2018-09-20 08:03:51
【问题描述】:

我有一个数据框input,就像下面的格式:

 queryid  wifi rssi
1 0004920b wifi1   10
2 0004920b wifi2   20
3 1114920b wifi3   15
4 11000492 wifi1   -10

我想创建一个稀疏矩阵,使用这个input 数据框。 例如:

queryid   wifi1  wifi2  wifi3
0004920b   10      20    .
1114920b    .       .    15
11000492   -10      .    .

【问题讨论】:

  • 重塑 ....pivot 问题 ..
  • df %>% tidyr::spread(wifi, rssi)
  • @MartinSchmelzer:那不是稀疏矩阵。
  • 从来没有这样说过。否则我会回答,而不是评论。
  • 你去 ;)

标签: r sparse-matrix


【解决方案1】:

我最初认为这是 Create Sparse Matrix from a data frame 的副本,但遇到了与 sparseMatrices 的赋值索引必须是数字的要求相关的错误,而那些 queryidwifi 列似乎是因素(或字符) .我将假设它们是因素,但用户应该检查。

library(Matrix)
(M <- with( dat, sparseMatrix(i= as.numeric(queryid), j=as.numeric(wifi),x=rssi)))
#------
3 x 3 sparse Matrix of class "dgCMatrix"

[1,]  10 20  .
[2,] -10  .  .
[3,]   .  . 15
dimnames(M) <- list( levels(dat$queryid), levels(dat$wifi) )
#-------
> M
3 x 3 sparse Matrix of class "dgCMatrix"
         wifi1 wifi2 wifi3
0004920b    10    20     .
11000492   -10     .     .
1114920b     .     .    15

如果这些是字符列,实际上会更难完成。考虑一下(但不是测试),我可能会在为字符列创建因子后使用此代码。

【讨论】:

  • 感谢您的优雅代码!是的,当queryidwifi的类型是字符时,会出现一些错误
  • 这个答案对于因子变量是错误的as.numeric 返回因子变量的底层整数表示。这些整数不是按照它们在data.frame 中出现的顺序排列的。但是,unique 按照它们在 data.frame 中出现的顺序给出这些值。这就是为什么行 1114920b 和 11000492 与示例中的行相反。
  • 认为unique 替换为levels 实际上会起作用。然而,factoras.numeric 文档包含非常可怕但太长而无法发表评论的警告:factoras.numeric
  • @T.C Proctor:已修复。 levels 对因子名称进行重新排序,与 factor 相同,而 uniques 不会重新排序值,而是按照它们在序列中出现的任何顺序进行排序。因此,应该阅读警告的不是因素或 as.numeric 帮助页面,而是 ?unique 页面。
  • @42- as.numeric 中的这个警告让我感到害怕/困惑:“如果 x 是一个因素, as.numeric 将返回基础数字(整数)表示,这通常是毫无意义的它可能与因子水平不对应。”我的理解是,这段代码假定“基础数字表示”是项目在“因子水平”中给出的顺序——即两者对应。也许如果你从级别中删除一个因素,整数不会改变,所以没有对应关系?
【解决方案2】:

这是一个简短的版本:

library(tidyverse)
library(Matrix)
df %>% 
  spread(wifi, rssi, fill = 0) %>%
  column_to_rownames("queryid") %>%
  as.matrix(.) %>%
  Matrix(., sparse =T)

输出:

3 x 3 sparse Matrix of class "dgCMatrix"
         wifi1 wifi2 wifi3
0004920b    10    20     .
11000492   -10     .     .
1114920b     .     .    15

【讨论】:

  • 这失去了直接创建稀疏矩阵的所有空间(和时间?)效率,因为它有一个中间密集矩阵。
  • 你说得对。根据应用程序,它是可以忽略的 Id 说。
猜你喜欢
  • 2018-12-14
  • 2016-01-13
  • 2012-01-10
  • 2017-03-31
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
相关资源
最近更新 更多