替换稀疏矩阵的前几个观察值

Replace the first few observations of a sparse matrix

我有如下数据,如下所示:

       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

这基本上用 NA 值替换了 group n。我正在尝试使用 dat_sparse@x <- names 将前 n 行重命名为 names 字符向量的长度。然而,它并没有真正按照我的意愿去做。

如何在不获取 NA 值的情况下将组名称包含为 "identifyer" 行?

数据:

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. 是行名。

这是一个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 . . . . . .