我在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中的稀疏矩阵?
答案 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)
取决于您希望如何处理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。