在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
相关产品推荐
相关产品推荐

