R语言按组求和仅统计每个个体首条记录的实现方法咨询
R语言按组求和实现(仅统计每个个体首条记录)
背景说明
- 示例数据规则:共4个分组,每组包含2个个体,每个个体对应2条记录,总数据量为16条
- 核心计算指标定义:
Func = X * Y + Z - 原有实现逻辑:对全部16条记录按分组计算Func的总和
- 需求:仅取每个个体的第一条记录计算Func,再按分组求和,最终输出长度为4的数值向量,对应4个分组的求和结果
示例数据生成代码
rm(list=ls()); set.seed(1234) G = 4 # 共4个分组 nTot <- 8 # 总共有8个个体 group <- rep(1:G, rep(4,G)) # 分组标识向量 individualID <- rep(1:nTot, rep(2,nTot)) # 个体标识向量,每个个体对应2条记录 n <- 2 * nTot # 总记录数16条 X <- rbinom(n, 1, 0.5) Y <- runif(n, 0, 1) Z <- runif(n, 0, 4) df1 <- round(data.frame(group, individualID, X, Y, Z), 3)
对应实现代码
基础包实现(无需额外依赖)
# 筛选每个个体第一条记录的索引 first_entry_idx <- !duplicated(individualID) # 计算全量Func指标 Func <- X * Y + Z # 仅取首条记录的Func和对应分组,按组求和 GroupSum <- as.numeric(sapply(split(Func[first_entry_idx], group[first_entry_idx]), sum))
输出的GroupSum就是长度为4的结果向量,分别对应4个分组的求和值。
dplyr包实现(逻辑更清晰易维护)
如果习惯使用tidyverse生态的工具,可以用如下代码实现:
library(dplyr) GroupSum <- df1 %>% group_by(individualID) %>% slice(1) %>% # 取每个个体的第一条记录 ungroup() %>% mutate(Func = X * Y + Z) %>% group_by(group) %>% summarise(sum_Func = sum(Func)) %>% pull(sum_Func)
内容的提问来源于stack exchange,提问作者John Majimboni
相关产品推荐
相关产品推荐

