如何创建新df:通过原值/列总和公式转换单元格计算相对丰度
计算物种相对丰度(保留物种名称列)
核心思路
不用删除物种名称列,直接针对数值型样本列计算相对丰度,再与物种列合并即可。以下提供两种适配大规模数据集的方法(支持数百行列):
方法1:基础R实现
先提取数值列计算相对丰度,再合并原物种列:
# 示例数据框(模拟你的数据集结构) df <- data.frame( Species = c("Species_A", "Species_B", "Species_C"), Sample1 = c(10, 20, 30), Sample2 = c(15, 25, 40), Sample3 = c(5, 15, 20) ) # 提取数值列(排除第一列物种名) num_cols <- df[, -1] # 计算每列的总和 col_totals <- colSums(num_cols) # 计算相对丰度:转置后按行除以列总和,再转置回原结构 rel_abund <- t(t(num_cols) / col_totals) # 合并物种列与相对丰度数据 new_df <- cbind(df[, 1, drop=FALSE], rel_abund)
方法2:tidyverse(dplyr)实现
更简洁,自动识别数值列,无需手动筛选:
library(dplyr) # 直接对所有数值列计算相对丰度,保留物种列 new_df <- df %>% mutate(across(where(is.numeric), ~ .x / sum(.x)))
为什么你之前的方法失败?
转置后原物种列变成首行字符向量,导致rowwise+c_across计算总和时混入非数值类型,引发错误。上面的方法无需转置,直接针对数值列操作,完美保留物种名称列,同时适配大规模数据集。
内容的提问来源于stack exchange,提问作者salix7
相关产品推荐
相关产品推荐

