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

按年份将数据框分十分位并计算各分位均值与中位数(R语言)

按年份对Category按value划分十分位并计算分组统计量

原始数据结构

df <- data.frame(Category = rep(LETTERS[1:15], each = 6),
                 Year = rep(2010:2015, 15),
                 value = runif(90, 50, 100))

需求

按年份分组,依据value字段将Category划分为十分位,计算每年每个十分位对应的value的均值与中位数,最终得到每行对应一个年份+十分位、包含两组统计量的数据集。

问题分析

你之前的十分位划分代码存在逻辑错误:没有按Year分组就调用ntile,导致生成的是全局范围内的十分位,而非每年独立划分的分组,这是后续计算不符合预期的核心原因。

正确实现方法

1. 使用dplyr完成全流程

library(dplyr)

# 先按年份分组,再划分十分位
df_processed <- df %>%
  group_by(Year) %>%
  mutate(quantile = ntile(value, 10)) %>%
  ungroup()

# 分组计算均值和中位数
result_dplyr <- df_processed %>%
  group_by(Year, quantile) %>%
  summarise(
    mean_value = mean(value, na.rm = TRUE),
    median_value = median(value, na.rm = TRUE),
    .groups = "drop"  # 取消分组,输出整洁数据框
  )

# 查看结果
head(result_dplyr)

2. 使用data.table完成全流程

library(data.table)

# 转换为data.table格式
dt <- setDT(df)

# 按年份划分十分位
dt[, quantile := ntile(value, 10), by = Year]

# 分组计算均值和中位数
result_dt <- dt[, .(mean_value = mean(value, na.rm = TRUE),
                    median_value = median(value, na.rm = TRUE)),
                by = .(Year, quantile)]

# 查看结果
head(result_dt)

结果说明

两种方法生成的结果结构一致:每行对应一个Year和quantile组合,包含该分组下value的均值(mean_value)和中位数(median_value),完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:16:08