R语言将OTU表转为betapart包适用二进制表并保留行名的方法咨询
解决方案
方法1:修复现有代码的行名丢失问题
行名丢失的原因是lapply返回列表结构,转换为数据框时默认会丢弃原有行名,只需提前保存行名、转换后重新赋值即可:
feat_table2 <- as.data.frame(t(feat_table)) #转置表格 colnames(feat_table2) <- feat_table2[1, ] #将第一行设为列名 feat_table3 <- feat_table2[-c(1),] #删除重复的首行 # 提前保存样本行名 row_names <- rownames(feat_table3) # 转换列类型+二值化 feat_table3 <- lapply(feat_table3,as.numeric) feat_table3 <- as.data.frame(feat_table3) # 把保存的行名赋值回新数据框 rownames(feat_table3) <- row_names # 生成二值化结果 feat_table3_bin <- as.data.frame(ifelse(feat_table3>0,1,0))
方法2:更高效的实现思路(推荐)
现有代码的冗余问题来源于转置时包含了非数值的ASV列,导致后续需要额外做字符转数值的操作。可以先将ASV列设为行名得到纯数值矩阵,再转置二值化,全程不会丢失行名,代码更简洁:
library(tidyverse) # 1. 将ASV列设为行名,得到纯数值的OTU计数矩阵 otu_mat <- feat_table %>% column_to_rownames("ASV") %>% as.matrix() # 2. 转置+二值化一步完成 otu_bin_mat <- t(otu_mat) otu_bin_mat[otu_bin_mat > 0] <- 1 # 3. 转为数据框,直接可用作betapart输入 otu_bin_df <- as.data.frame(otu_bin_mat)
如果你的OTU表是直接从phyloseq对象中提取的,还可以进一步简化:
# 直接从phyloseq对象提取二值化转置后的OTU表 otu_bin_df <- otu_table(your_physeq_obj) %>% t() %>% apply(2, function(x) ifelse(x > 0, 1, 0)) %>% as.data.frame()
内容的提问来源于stack exchange,提问作者pavlo
相关产品推荐
相关产品推荐

