从R中的条目行创建稀疏矩阵

时间:2018-04-24 16:40:38

标签: r dataframe matrix

我在R中有以下格式的数据框:

                     lemma       mi                                 doc
1        butroe_polihalino 5.385031 ANEJO_05_Q ECOL_Cantabrico Oriental
2        tramo_oligohalino 5.385031 ANEJO_05_Q ECOL_Cantabrico Oriental
3 programas_de_seguimiento 5.385031 ANEJO_05_Q ECOL_Cantabrico Oriental
4                     ifim 5.385031 ANEJO_05_Q ECOL_Cantabrico Oriental
5                      rdl 5.385031 ANEJO_05_Q ECOL_Cantabrico Oriental
6                 prointec 5.385031 ANEJO_05_Q ECOL_Cantabrico Oriental

我想创建一个稀疏矩阵(我将在其中运行PCA):

                butroe_polihalino tramo_oligohalino ...
ANEJO_05_...    5.385031          5.385031
docs2           (no value)        4.321345
...

其中包含文档为行,lemmas为列,mi为值。也可能没有定义值。

有没有办法从数据中定义R中的稀疏矩阵?

2 个答案:

答案 0 :(得分:1)

您可以使用基础sparseMatrix包中的matrix。 (假设您的data.frame中没有因素。)

m <- Matrix::sparseMatrix(i = match(df$doc, unique(df$doc)), 
                          j = match(df$lemma, unique(df$lemma)), 
                          x = df$mi,
                          dimnames = list(unique(df$doc), unique(df$lemma)))
来自caste_sparse

tidytext。这样可以减少输入,如果您的数据有不同因素,该功能会进行一些检查。

m <- tidytext::cast_sparse(df, row = doc, column = lemma, value = mi)

数据:

df <- structure(list(lemma = c("butroe_polihalino", "tramo_oligohalino", "programas_de_seguimiento", 
                               "ifim", "rdl", "prointec"), 
                     mi = c(5.385031,5.385031, 5.385031, 5.385031, 5.385031, 5.385031), 
                     doc = c("ANEJO_05_Q ECOL_Cantabrico Oriental","ANEJO_05_Q ECOL_Cantabrico Oriental", 
                             "ANEJO_05_Q ECOL_Cantabrico Oriental", "ANEJO_05_Q ECOL_Cantabrico Oriental", 
                             "ANEJO_05_Q ECOL_Cantabrico Oriental", "ANEJO_05_Q ECOL_Cantabrico Oriental")), 
                .Names = c("lemma", "mi", "doc"), 
                class = "data.frame", 
                row.names = c(NA, -6L))

答案 1 :(得分:1)

取决于您希望如何处理lemmadoc中未出现的值组合的情况。你提到他们“没有定义”,并建议在答案中出现“(没有价值)”。

这是一个更完整的玩具示例:

set.seed(1)
(dfr <- data.frame(lemma = rep(c("foo", "bar", "baz"), each = 2),
           mi = runif(6),
           doc = rep(c("mary", "jane", "mary", "bruce", "dolly", "zizz")),
           stringsAsFactors = FALSE))
#>   lemma        mi   doc
#> 1   foo 0.2655087  mary
#> 2   foo 0.3721239  jane
#> 3   bar 0.5728534  mary
#> 4   bar 0.9082078 bruce
#> 5   baz 0.2016819 dolly
#> 6   baz 0.8983897  zizz

如果在这种情况下显示数字0是有意义的,您只需使用xtabs,如下所示:

xtabs(mi ~ lemma + doc, dfr, sparse = TRUE)

#> 3 x 5 sparse Matrix of class "dgCMatrix"
#>      doc
#> lemma     bruce     dolly      jane      mary      zizz
#>   bar 0.9082078 .         .         0.5728534 .        
#>   baz .         0.2016819 .         .         0.8983897
#>   foo .         .         0.3721239 0.2655087 .

如果您希望NA意义上的值丢失,那么这是我能做的最好的事情,使用tapply

Matrix::Matrix(with(dfr, tapply(mi, list(lemma, doc), sum), sparse = TRUE))

#> 3 x 5 Matrix of class "dgeMatrix"
#>         bruce     dolly      jane      mary      zizz
#> bar 0.9082078        NA        NA 0.5728534        NA
#> baz        NA 0.2016819        NA        NA 0.8983897
#> foo        NA        NA 0.3721239 0.2655087        NA

使用Matrix::Matrix明确地使其成为稀疏矩阵。

请记住,稀疏矩阵在很大且没有很多非零条目时非常有用,并且NA 0。