如何按individualIndex分组,对testPhase配对汇总total_correct值?
按个体分组,两两配对测试阶段并汇总得分的解决方案
需求说明
对数据按individualIndex分组,将每组内的testPhase按顺序两两配对(如01+02、03+04),合并阶段名称的同时,汇总对应total_correct的数值。
示例数据
先构造可复现的示例数据:
df <- data.frame( individualIndex = c(rep(0,10), rep(1,8)), testPhase = c(sprintf("%02d", 1:10), sprintf("%02d", 1:8)), total_correct = c(7,7,6,5,9,10,5,9,6,9,9,9,13,10,8,11,12,10) )
实现方案
1. 使用dplyr(tidyverse生态)
核心思路是分组后给每行分配配对组ID,再按配对组聚合:
library(dplyr) result_df <- df %>% group_by(individualIndex) %>% # 生成配对组编号:每2行一组 mutate(pair_group = (row_number() - 1) %/% 2) %>% group_by(individualIndex, pair_group) %>% summarise( testPhase = paste(testPhase, collapse = "+"), total_correct = sum(total_correct), .groups = "drop" ) %>% select(-pair_group) # 移除中间辅助列 print(result_df)
2. 使用data.table(适合大数据量)
data.table语法简洁,处理大样本数据效率更高:
library(data.table) setDT(df) result_dt <- df[, .(testPhase = paste(testPhase, collapse = "+"), total_correct = sum(total_correct)), by = .(individualIndex, pair_group = (seq_len(.N)-1) %/% 2)] result_dt[, pair_group := NULL] # 删除辅助列 print(result_dt)
关键逻辑说明
(row_number()-1) %/% 2(dplyr)或(seq_len(.N)-1) %/% 2(data.table):通过整数除法生成配对组ID,确保每连续两行被分到同一组,自动兼容奇数行数的情况(最后一行单独成组)。paste(testPhase, collapse="+"):将同一组内的测试阶段名称合并为XX+XX格式。sum(total_correct):汇总同一组内的得分。
内容的提问来源于stack exchange,提问作者Lior Bruder
相关产品推荐
相关产品推荐

