如何使用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
相关产品推荐
相关产品推荐

