【问题标题】:R: Generating sparse matrix with all elements as rows and columnsR:生成所有元素为行和列的稀疏矩阵
【发布时间】:2018-04-03 23:56:06
【问题描述】:

我有一个用户到用户的数据集。它没有将所有用户都设置为 col 和 row。例如,

 U1      U2     T
  1      3      1
  1      6      1
  2      4      1
  3      5      1

u1 和 u2 代表数据集的用户。当我使用以下代码创建稀疏矩阵时,(df-将上述数据集的所有数据保留为数据框)

trustmatrix <- xtabs(T~U1+U2,df,sparse = TRUE)  

   3  4  5  6
1  1  0  0  1
2  0  1  0  0
3  0  0  1  0

因为这个矩阵没有如下行和列中的所有用户。

   1  2  3  4  5  6
1  0  0  1  0  0  1
2  0  0  0  1  0  0
3  0  0  0  0  1  0
4  0  0  0  0  0  0 
5  0  0  0  0  0  0
6  0  0  0  0  0  0

如果我想在稀疏矩阵之后得到上面的矩阵,我该如何在 R 中这样做?

【问题讨论】:

    标签: r sparse-matrix


    【解决方案1】:

    我们可以将列转换为factor,其中levels 为1 到6,然后使用xtabs

    df1[1:2] <- lapply(df1[1:2], factor, levels = 1:6)
    as.matrix(xtabs(T~U1+U2,df1,sparse = TRUE))
    #   U2
    #U1  1 2 3 4 5 6
    #  1 0 0 1 0 0 1
    #  2 0 0 0 1 0 0
    #  3 0 0 0 0 1 0
    #  4 0 0 0 0 0 0
    #  5 0 0 0 0 0 0
    #  6 0 0 0 0 0 0
    

    或者另一种选择是使用 0 填充扩展索引,然后使用 sparseMatrix

    library(tidyverse)
    library(Matrix)
    df2 <- crossing(U1 = 1:6, U2 = 1:6) %>% 
              left_join(df1) %>% 
              mutate(T = replace(T, is.na(T), 0))
    sparseMatrix(i = df2$U1, j = df2$U2, x = df2$T)
    

    或使用spread

    spread(df2, U2, T)
    

    【讨论】:

    • 谢谢@akrun。第一个答案完美无缺。我仍然想知道因素在 R 中是如何工作的。我无法理解其他两种方法。穿越功能是否需要额外封装?
    • @Anu 穿越来自tidyr,这是tidyverse中的包之一。指定levels 的因子将确保那些没有任何值的级别不会被丢弃。第二种方法是用crossing创建完整的组合,然后用原始数据集做一个left_join并将NA值替换为0,然后传播到宽格式
    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 2018-12-13
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多