Создать разреженную матрицу из строк записей в R - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть кадр данных в 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
...

Который в основном содержит документы в виде строк, леммы в виде столбцов, а mi - это значение.Также возможно иметь не определенные значения.

Есть ли какой-либо способ определения разреженной матрицы, такой как в R, из данных?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Зависит от того, как вы хотите справиться со случаями, когда есть комбинации значений в lemma и doc, которые не отображаются.Вы упоминаете, что они «не определены», и предлагаете «(без значения)» появиться в ответе.

Вот более полный пример игрушки:

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.

0 голосов
/ 24 апреля 2018

Вы можете использовать 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...