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

如何使用R计算按id分组的各字段累计计数

R按分组计算指定列累计计数的实现代码

这里提供两种实现方案,运行后均可得到你给出的预期输出:

1. dplyr实现(推荐,代码简洁易读)

# 未安装dplyr先运行 install.packages("dplyr")
library(dplyr)

# 构造原始数据框
df <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 
                     drug_1 = c(0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1), 
                     drug_2 = c(0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1)), 
                class = "data.frame", row.names = c(NA, -12L))

# 计算得到目标结果
res <- df %>%
  group_by(id) %>%
  # 对所有非id列按规则计算,自动加_b后缀
  across(-id, ~ifelse(.x == 0, 0, cumsum(.x)), .names = "{.col}_b") %>%
  ungroup() %>%
  # 重命名id为id2,仅保留需要的列
  rename(id2 = id) %>%
  select(id2, ends_with("_b"))

2. 基础R实现(无需安装额外包)

# 构造原始数据框
df <- structure(list(id = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2), 
                     drug_1 = c(0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1), 
                     drug_2 = c(0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1)), 
                class = "data.frame", row.names = c(NA, -12L))

# 按id拆分数据分别处理后合并
res <- do.call(rbind, lapply(split(df, df$id), function(sub) {
  sub$drug_1_b <- ifelse(sub$drug_1 == 0, 0, cumsum(sub$drug_1))
  sub$drug_2_b <- ifelse(sub$drug_2 == 0, 0, cumsum(sub$drug_2))
  out <- sub[,c("id", "drug_1_b", "drug_2_b")]
  colnames(out)[1] <- "id2"
  return(out)
}))
# 重置行名
rownames(res) <- NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:36:02