如何在R中基于数据框计算FPKM并生成对应结果列?
问题描述
我有如下结构的数据框,希望使用公式
fpkm = (X * 10^9) / (colSums(X) * length)(示例:第一行计算式为(1691 * 10^9)/(12660 * 1161)),对第5至8列(bam_RC1至bam_RC4)计算FPKM,并将结果存入单独的列。请问如何编写实现该功能的函数?数据框结构:
chr start end strand bam_RC1 bam_RC2 bam_RC3 bam_RC4 length chr8 85554228 85555389 - 1691 137 45 107 1161 chr11 60877576 60879894 - 2410 235 72 161 2318 chr12 108793341 108795193 - 3334 143 64 164 1852 chr2 92432803 92434088 - 1043 60 28 66 1285 chr13 100124401 100125923 - 1479 114 62 129 1522 chr7 109519172 109521109 - 2703 123 36 95 1937
解决方案(R语言)
以下是实现需求的自定义函数,直接调用即可完成FPKM计算并添加新列:
calculate_fpkm <- function(df) { # 提取目标计数列(第5-8列) rc_cols <- df[, 5:8] # 计算每列的总计数 col_totals <- colSums(rc_cols) # 获取基因长度列 gene_len <- df$length # 批量计算FPKM fpkm_list <- lapply(seq_along(rc_cols), function(col_idx) { (rc_cols[[col_idx]] * 1e9) / (col_totals[col_idx] * gene_len) }) # 给FPKM列命名 names(fpkm_list) <- paste0(names(rc_cols), "_fpkm") # 合并到原数据框并返回 cbind(df, as.data.frame(fpkm_list)) }
使用方法
假设你的数据框名为gene_df,执行以下代码得到带FPKM列的新数据框:
gene_df_with_fpkm <- calculate_fpkm(gene_df)
可选调整
如果后续目标列的位置可能变化,建议按列名提取计数列,替换函数内的rc_cols行:
rc_cols <- df[, c("bam_RC1", "bam_RC2", "bam_RC3", "bam_RC4")]
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

