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

如何在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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:32:06