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

如何按Participant_ID与Attribute分组求Rating列均值生成新data.frame?

问题与解决方案

问题描述

我有一个实验相关的data.frame,结构如下例所示。希望根据Attribute值将每两行合并,将数据行数减半。最终要为每个参与者的每个Attribute,计算五个Rating列各自的平均值,生成新的数值。

例如,对于Participant_ID = 1,行1和行2的Attribute均为X,需合并这两行;行3和行4的Attribute均为Y,需合并;行5和行6的Attribute均为Z,需合并;其他参与者以此类推。

示例数据代码:

# Example data
Participant_ID <- c(rep(1, 6), rep(2, 6), rep(3, 6))
Gender <- c(rep("M", 6), rep("F", 6), rep("M", 6))
Group <- c(rep("A", 6), rep("B", 6), rep("C", 6))
Attribute <- rep(c(rep("X", 2), rep("Y", 2), rep("Z", 2)), 3)
Rating_1 <- sample(1:5, 18, replace = TRUE)
Rating_2 <- sample(1:5, 18, replace = TRUE)
Rating_3 <- sample(1:5, 18, replace = TRUE)
Rating_4 <- sample(1:5, 18, replace = TRUE)
Rating_5 <- sample(1:5, 18, replace = TRUE)

dat <- data.frame(factor(Participant_ID), factor(Gender), factor(Group), 
factor(Attribute), Rating_1, Rating_2, Rating_3, Rating_4, Rating_5)
# 修正列名(原代码生成的列名带factor(),建议重命名)
colnames(dat) <- c("Participant_ID", "Gender", "Group", "Attribute", 
                   "Rating_1", "Rating_2", "Rating_3", "Rating_4", "Rating_5")

解决方案

方法1:使用dplyr(tidyverse生态)

这是最常用的数据分析语法,代码可读性高:

# 先安装并加载dplyr包
# install.packages("dplyr")
library(dplyr)

# 分组计算均值
dat_agg <- dat %>%
  group_by(Participant_ID, Gender, Group, Attribute) %>%
  summarise(across(starts_with("Rating"), mean), .groups = "drop")

# 查看结果
dat_agg
  • group_by():指定分组依据,这里按参与者ID、性别、组别、属性分组,确保每个组内是需要合并的两行数据
  • across(starts_with("Rating"), mean):对所有以"Rating"开头的列计算平均值
  • .groups = "drop":计算完成后取消分组结构,返回普通data.frame

方法2:使用data.table(适合大数据量)

如果你的数据集很大,data.table的运算速度会更快:

# 安装并加载data.table包
# install.packages("data.table")
library(data.table)

# 转换为data.table格式
setDT(dat)

# 分组计算均值
dat_agg <- dat[, lapply(.SD, mean), 
               by = .(Participant_ID, Gender, Group, Attribute),
               .SDcols = patterns("^Rating")]

# 查看结果
dat_agg
  • by = .(...):指定分组列
  • .SDcols = patterns("^Rating"):指定需要计算的列(以Rating开头)
  • lapply(.SD, mean):对选中的列逐一计算均值

方法3:基础R的aggregate函数(无需额外包)

如果不想安装第三方包,可以用基础R的aggregate函数:

# 指定分组列和需要计算的列
group_cols <- c("Participant_ID", "Gender", "Group", "Attribute")
rating_cols <- grep("^Rating", colnames(dat), value = TRUE)

# 计算均值
dat_agg <- aggregate(dat[rating_cols], by = dat[group_cols], FUN = mean)

# 查看结果
dat_agg
  • aggregate()的第一个参数是需要计算的数值列,第二个参数是分组列,FUN = mean指定计算均值

内容的提问来源于stack exchange,提问作者Peter Miksza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:21:00