如何在R中按指定行数分组Event Full并计算Scores均值?
高效实现R语言数据框的条目分组编号与均值计算
核心逻辑
按Subject分组,在每个Subject内部将行每2个划分为一个子条目;给每个Subject内的子条目分配连续编号;最后计算每个子条目的Scores均值。
dplyr实现(适合常规数据量)
library(dplyr) # 原始数据 data <- data.frame( Subject = c(101, 101, 102, 102, 102, 102, 102, 102), `Event Full` = c('a', 'a', 'a', 'a', 'a', 'a', 'b', 'b'), Scores = c(1,1,2,2,3,3,4,4) ) # 处理流程 solution <- data %>% # 按Subject和Event Full标记组内行号,确保同Event的行连续 group_by(Subject, `Event Full`) %>% mutate(row_in_group = row_number()) %>% ungroup() %>% # 按Subject划分每2行一个子条目 group_by(Subject) %>% mutate(sub_entry_id = ceiling(row_number() / 2)) %>% # 按子条目分组计算均值,保留Event Full group_by(Subject, sub_entry_id) %>% summarise( `Event Full` = first(`Event Full`), Scores = mean(Scores), .groups = "drop" ) %>% # 给每个Subject内的子条目分配连续编号 group_by(Subject) %>% mutate(Num = row_number()) %>% ungroup() %>% # 调整列顺序匹配示例 select(Subject, `Event Full`, Num, Scores) # 查看结果 print(solution)
运行后输出:
# A tibble: 4 × 4 Subject `Event Full` Num Scores <dbl> <chr> <int> <dbl> 1 101 a 1 1 2 102 a 1 2 3 102 a 2 3 4 102 b 3 4
data.table实现(适合大数据量,效率更高)
library(data.table) setDT(data) solution_dt <- data[, row_in_subject := .I, by = Subject][ # 按Subject划分每2行一个子条目 , sub_entry_id := ceiling(row_in_subject / 2), by = Subject][ # 按子条目分组计算均值并分配编号 , .( `Event Full` = first(`Event Full`), Scores = mean(Scores), Num = .GRP ), by = .(Subject, sub_entry_id)][ # 清理冗余列并调整顺序 , row_in_subject := NULL][ , setcolorder(c("Subject", "Event Full", "Num", "Scores")) ] print(solution_dt)
输出结果与dplyr版本完全一致。
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

