Зависит от того, как вы хотите справиться со случаями, когда есть комбинации значений в 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.