R语言sapply计算相对丰度报错:字符型参数无法求和的解决求助
解决R计算真菌相对丰度时的字符列求和报错问题
修复代码
你的报错核心是dat_clean第一列是字符型OTU编号,而sapply会遍历所有列,导致sum()试图计算字符向量触发错误。直接修改代码,只对数值型的样本计数列计算相对丰度即可,有两种简洁的处理方式:
方式1:提前剥离字符列并设置行名
如果OTU编号仅用于标识行,直接把它转为行名后移除该列:
# 将OTU编号设为行名 rownames(dat_clean) = dat_clean[, 1] # 提取所有数值型计数列 dat_clean_num = dat_clean[, -1] # 计算相对丰度 dat_relab = as.data.frame(sapply(dat_clean_num, function(x) x / sum(x))) rownames(dat_relab) = rownames(dat_clean) # 移除低丰度ASVs(替换固定列索引为动态索引,避免样本数变化出问题) dat_relab$relab = rowSums(dat_relab) keep01 = which(dat_relab$relab > 0.0001) dat_relab01 = dat_relab[keep01, -ncol(dat_relab)] # 筛选原始计数表中的高丰度ASVs dat_clean2 = dat_clean_num[rownames(dat_relab01), colnames(dat_relab01)]
方式2:直接筛选数值列计算
如果不想修改原始数据集结构,直接在sapply中指定只处理数值列:
# 仅对数值型列计算相对丰度 dat_relab = as.data.frame(sapply(dat_clean[, sapply(dat_clean, is.numeric)], function(x) x / sum(x))) # 手动设置行名(如果原始行名不是OTU编号,就用第一列的值) rownames(dat_relab) = if(is.character(dat_clean[,1])) dat_clean[,1] else rownames(dat_clean) # 后续低丰度筛选代码同上面的修改版(用-ncol代替-26)
教程无报错的原因推测
教程里的dat_clean应该是把OTU编号作为行名存储,而非单独的一列。也就是说教程的数据集结构中,所有数据列都是数值型的样本计数,sapply遍历的都是可计算的数值列,自然不会触发字符类型的报错。
内容的提问来源于stack exchange,提问作者DudeBro231
相关产品推荐
相关产品推荐

