如何在R中创建稀疏矩阵

时间:2018-04-10 15:56:36

标签: r sparse-matrix

我有一个数据框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      .    .

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

这是一个简短的版本:

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