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

在R语言中计算满足双分组条件且符合筛选规则的数据集均值

R按多字段分组计算均值实现方法

需求说明

你需要实现的是按year和book_id两个字段分组,过滤2018年数据后计算users_read字段的均值,对应SQL逻辑如下:

Select year, book_id, avg(users_read)
From 表名
Where year = 2018 
Group by year, book_id

实现方案

方案1:使用R基础包aggregate函数(无需安装额外包)

# 替换df为你的实际数据集名称
# 第一步:过滤2018年数据
df_2018 <- df[df$year == 2018, ]
# 第二步:双字段分组计算均值
result <- aggregate(users_read ~ year + book_id, data = df_2018, FUN = mean)
# 可选:重命名列匹配你需要的输出格式
colnames(result)[3] <- "avg(users_read)"

输出结果默认就是三列结构化数据框,和你要求的表格格式一致。

方案2:使用dplyr包(语法更贴近SQL,易读性高)

# 未安装的话先运行 install.packages("dplyr")
library(dplyr)

result <- df %>%
  filter(year == 2018) %>% # 过滤2018年数据
  group_by(year, book_id) %>% # 指定分组字段
  summarise(`avg(users_read)` = mean(users_read), .groups = "drop") # 计算均值并自动解除分组

补充:你提到的tapply也支持多索引分组

tapply的INDEX参数可以传入列表来指定多个分组维度,只是返回结果默认是矩阵格式,需要额外转换为数据框:

df_2018 <- df[df$year == 2018, ]
# 多索引分组计算
tapply_res <- tapply(df_2018$users_read, INDEX = list(df_2018$year, df_2018$book_id), FUN = mean)
# 转换为结构化数据框
result <- as.data.frame(as.table(tapply_res), responseName = "avg(users_read)")
# 重命名维度列
colnames(result)[1:2] <- c("year", "book_id")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:33:04