如何用循环计算dataframe中按列递进的行累积和?
高效实现行逐步累积和并添加新列
你需要为按泳道存储基因表达数据的dataframe添加新列,每行从第2列开始逐步累加后续列的和,手动使用apply()效率极低,这里提供两种高效实现方式:
方法1:基础R内置函数实现
无需循环,直接通过行累积和提取所需结果:
# 提取数值列(排除第一列的基因名) num_cols <- df[, -1] # 计算每行的累积和并转置为列格式 row_cumsums <- t(apply(num_cols, 1, cumsum)) # 提取目标累积值:去掉第一列(对应单独c2的值),保留从2到3、2到4、2到5的和 new_cols <- row_cumsums[, -1] # 设置新列名,匹配需求格式 colnames(new_cols) <- paste0("sum.2.", 3:ncol(df)) # 合并新列到原dataframe df_new <- cbind(df, new_cols)
方法2:matrixStats包实现(大数据集首选)
针对超大数据集,matrixStats包的rowCumsums是高度优化的向量化函数,性能远优于apply():
# 安装并加载包(首次使用需安装) # install.packages("matrixStats") library(matrixStats) # 将数值列转为矩阵格式 num_cols <- as.matrix(df[, -1]) # 计算行累积和 row_cumsums <- rowCumsums(num_cols) # 提取目标列并重命名 new_cols <- row_cumsums[, -1] colnames(new_cols) <- paste0("sum.2.", 3:ncol(df)) # 合并结果 df_new <- cbind(df, new_cols)
验证结果
运行后得到的df_new与手动计算结果完全一致:
> df_new c1 c2 c3 c4 c5 sum.2.3 sum.2.4 sum.2.5 1 G1 5 3 6 6 8 14 20 2 G2 3 7 3 4 10 13 17 3 G3 1 1 4 3 2 6 9
内容的提问来源于stack exchange,提问作者sam donato
相关产品推荐
相关产品推荐

