R语言矩阵转换问题:将测序数据转为OTU表格式
解决方案
你可以用以下几种方法实现长格式测序数据到宽格式OTU表的转换:
方法1:使用tidyr包的pivot_wider(推荐,语法直观)
若未安装tidyr包,先执行安装:
install.packages("tidyr") library(tidyr)
再进行格式转换:
# 转换为宽格式数据框 otu_table <- pivot_wider(test, names_from = barcode, values_from = fraction) # 按需转为矩阵格式 otu_matrix <- as.matrix(otu_table[, -1], rownames = otu_table$name)
方法2:基础R的reshape函数
# 转换为宽格式数据框 otu_table <- reshape(test, idvar = "name", timevar = "barcode", direction = "wide") # 设置行名为物种名 rownames(otu_table) <- otu_table$name # 转为矩阵并清理列名 otu_matrix <- as.matrix(otu_table[, -1]) colnames(otu_matrix) <- gsub("fraction\\.", "", colnames(otu_matrix))
方法3:使用xtabs函数(适合直接生成交叉值矩阵)
otu_matrix <- xtabs(fraction ~ name + barcode, data = test)
原代码错误说明
你之前的代码中,as.vector(test)会把整个数据框拆解为一维向量,完全丢失了原有的分组结构;同时matrix()要求行名、列名的长度必须分别匹配矩阵的行数、列数,但你使用重复的barcode和name作为dimnames,长度与矩阵实际维度不匹配,因此触发报错。
内容的提问来源于stack exchange,提问作者Marwin
相关产品推荐
相关产品推荐

