如何在稀疏矩阵中保留分组名作为行标识符且避免NA值?
如何保留分组名作为行标识符构建稀疏矩阵?
问题回顾
你在处理包含分组标签和唯一ID的数据集时,尝试转换为稀疏矩阵却碰到了麻烦:分组名被替换成了NA,还收到了NAs introduced by coercion的警告,直接修改dat_sparse@x也没解决问题。核心诉求很明确:要让分组名(比如group 1、group 2)成为稀疏矩阵的行标识符,同时避免NA的产生。
问题出在哪?
你的原代码最后一步直接把包含字符型分组列的矩阵丢给Matrix()函数了——稀疏矩阵默认只认数值型数据,字符型的分组列被强制转成数值时自然就变成NA了,这就是警告的来源。
可行的解决办法
你自己摸索出来的思路完全正确!先把分组列提取为行名,再处理数值部分转稀疏矩阵就行,完整的可复用代码如下:
library(tidyr) library(dplyr) library(Matrix) library(tibble) # 生成示例数据(和你的代码一致) 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) dat <- cbind(col1, col2) # 正确的稀疏矩阵构建流程 dat_sparse <- dat %>% as_tibble() %>% count(col1, col2) %>% spread(col2, n, fill = 0) %>% as.matrix() # 把分组列设为行名,移除原分组列 rownames(dat_sparse) <- dat_sparse[,1] dat_sparse_num <- dat_sparse[,-1] # 转换为稀疏矩阵 new_mat <- Matrix(dat_sparse_num, sparse = TRUE) # 检查结果 head(new_mat) rownames(new_mat) # 这里就能看到保留的group 1、group 2等行名了
核心步骤说明
- 用
spread()生成宽矩阵后,先把字符型的col1赋值给矩阵的行名,把分组信息留存下来; - 删掉原有的分组列,只留数值型的计数数据,再传入
Matrix()构建稀疏矩阵——这样就不会触发强制转换,自然也就不会有NA了。
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

