如何按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
相关产品推荐
相关产品推荐

