You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中按行计算列累积和并除以对应total_min值

问题解决:按行计算累积和并除以对应total_min值

错误原因

你之前的代码dat[,2:6] <- t(apply(dat[,2:6], 1, cumsum)/dat$total_min)出错,核心问题是维度不匹配导致循环补齐错误:dat$total_min是长度为3的向量,当你把apply返回的每行累积和(长度5)和这个向量做除法时,R会自动循环补齐,导致每行的累积和重复除以total_min的所有值,而非仅除以该行对应的total_min。

正确实现方式

方法1:基础R实现(直接按行处理)

先修正原始数据集的定义(你提供的dat代码与Table1数值不一致,需对齐),再通过sapply按行索引处理,确保每行累积和仅除以该行的total_min:

# 加载与Table1一致的原始数据
dat <- data.frame(
  stringsAsFactors = FALSE,
  flower = c("lily", "rose", "daisy"),
  x1902 = c(23L, 50L, 30L),
  x1950 = c(0L, 60L, 7L),
  x2010 = c(0L, 5L, 10L),
  x2012 = c(8L, 16L, 2L),
  x2021 = c(5L, 0L, 0L),
  total_min = c(5L, 5L, 2L)
)

# 按行计算累积和并除以对应total_min
dat[, 2:6] <- t(sapply(seq_len(nrow(dat)), function(i) {
  cumsum(dat[i, 2:6]) / dat$total_min[i]
}))

方法2:tidyverse风格(更直观)

如果习惯管道式操作,用dplyr的rowwise()按行处理,结合c_across实现跨行累积计算:

library(dplyr)

dat <- dat %>%
  rowwise() %>%
  mutate(across(x1902:x2021, ~ cumsum(c_across(x1902:x2021))[cur_column()] / total_min)) %>%
  ungroup()

最终结果

运行后得到与你期望完全一致的结果:

flowerx1902x1950x2010x2012x2021total_min
lily4.64.64.66.27.25
rose10222326.226.25
daisy1518.523.524.524.52

内容的提问来源于stack exchange,提问作者Shae11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:54:21