我有以下数据,如下所示:
col1 col2
[1,] "group 5" "BNDBP6569M"
[2,] "group 3" "MMCRO7403D"
[3,] "group 3" "QFMVN5837D"
[4,] "group 3" "JEXQH9565P"
[5,] "group 3" "VEGAE7145C"
[6,] "group 1" "JHRQM4424S"
[7,] "group 2" "HNABS7216I"
我将其设置为稀疏格式,如下所示:
[1,] NA . . . 1 . . 1 . . . 1 1 . . . . . . . . . . . . . . . . . . . 1 . . . . .
[2,] NA . 1 . . 1 . . . 1 1 . . . . . . . . . 1 1 . . 1 . 1 . . . . . . . . . . .
[3,] NA 1 . . . . . . . . . . . . . 1 1 . . . . . . 1 . . . 1 1 . . . . 1 . . . 1
[4,] NA . . . . . . . 1 . . . . . . . . 1 . 1 . . 1 . . . . . . 1 . 1 . . . . 1 .
[5,] NA . . 1 . . 1 . . . . . . 1 1 . . . 1 . . . . . . 1 . . . . 1 . . . 1 1 . .
当我创建这个稀疏矩阵时,我得到一个警告:
Warning message:
In storage.mode(from) <- "double" : NAs introduced by coercion
实质上将group n
替换为NA
值。我正在尝试使用n
将前names
行重命名为dat_sparse@x <- names
字符向量的长度。但是,这并不是我真正想要的。
如何在不获取NA值的情况下将组的名称包括为“标识符”行?
数据:
library(tidyr)
library(dplyr)
library(Matrix)
library(rsample)
library(tibble)
library(purrr)
names <- c("name1", "name2", "name3", "name4")
col1 <- sample(1:5, 100, replace = TRUE)
col1 <- paste("group", col1)
myFun <- function(n = 5000) {
a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
col2 <- myFun(100)
col2
dat <- cbind(col1, col2)
dat
dat_sparse <- dat %>%
as_tibble() %>%
count(col1, col2) %>%
spread(col2, n, fill = 0) %>%
as.matrix() %>%
Matrix(., sparse = TRUE)
dat_sparse
编辑:
我认为问题出在这里的最后两行:
dat_sparse <- dat %>%
as_tibble() %>%
count(col1, col2) %>%
spread(col2, n, fill = 0) %>%
as.matrix() %>%
Matrix(., sparse = TRUE)
将行名设置为Matrix()
对象正在重现警告和NA值。只需在此处删除Matrix()
步骤并运行以下命令即可:
dat_sparse <- dat %>%
as_tibble() %>%
count(col1, col2) %>%
spread(col2, n, fill = 0) %>%
as.matrix()
rownames(dat_sparse) <- dat_sparse[,1]
dat_spares <- dat_sparse[,-c(1)]
new_mat <- Matrix(dat_spares)
似乎可以正常工作。 new_mat
看起来像:
group 1 . . . . . 1 . . 1 . . . 1 . . . 1 . . . 1 . . . . . . 1 1
group 2 1 . 1 . 1 . . . . . . . . 1 1 . . . . 1 . 1 . . 1 . . . .
group 3 . 1 . 1 . . 1 . . . . 1 . . . . . . 1 . . . 1 1 . . 1 . .
group 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
group 5 . . . . . . . 1 . 1 1 . . . . 1 . 1 . . . . . . . 1 . . .
其中group 1, group 2 etc.
是行名。
答案 0 :(得分:3)
这是一个tidy
解决方案。
dat_sparse <- dat %>%
as_tibble() %>%
count(col1, col2) %>%
spread(col2, n, fill = 0) %>%
column_to_rownames("col1") %>%
as.matrix() %>%
Matrix(., sparse = TRUE)
dat_sparse
输出:
group 1 . . . 1 . 1 . . 1 . . . . . . 1 1 . . 1 . . . . . . . . .
group 2 . 1 . . . . . . . 1 1 . . . 1 . . 1 1 . . . . 1 . . . 1 .
group 3 1 . 1 . . . 1 1 . . . 1 1 1 . . . . . . . 1 . . 1 1 . . 1
group 4 . . . . 1 . . . . . . . . . . . . . . . 1 . . . . . 1 . .
group 5 . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . .