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

在R中按年份分组,基于列A的分位数生成因子变量列B

解决方案

首先修正你提供的数据集创建代码(原代码中year列末尾缺少逗号,会导致语法错误):

df <- data.frame(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3,
                        4, 4, 4, 5, 5, 5),
                 year = c(2000, 2005, 2010, 2000, 2005, 2010,
                          2000, 2005, 2010, 2000, 2005, 2010),
                 A = c(0, 3000, 1000, 5000, 0, 2000, 2000,
                        1000, 0, 0, 1000, 7000))

你之前的代码问题在于未按年份分组,且quantcut的probs参数使用错误。以下是三种可行的实现方式:

方法1:用ntile实现等数量分组

适合需要每组样本量大致相等的场景:

library(tidyverse)

df <- df %>%
  group_by(year) %>%
  mutate(
    B = case_when(
      ntile(A, 3) == 1 ~ "最低33%",
      ntile(A, 3) == 2 ~ "33-67%",
      ntile(A, 3) == 3 ~ "最高33%"
    ) %>% factor(levels = c("最低33%", "33-67%", "最高33%")) # 固定因子顺序
  ) %>%
  ungroup()

方法2:用cut结合分位数值分组

严格按分位数值划分,更贴合“33%分位数”的定义:

df <- df %>%
  group_by(year) %>%
  mutate(
    # 计算当前年份的33%、67%分位数
    q33 = quantile(A, 0.33, na.rm = TRUE),
    q67 = quantile(A, 0.67, na.rm = TRUE),
    B = case_when(
      A <= q33 ~ "最低33%",
      A > q33 & A <= q67 ~ "33-67%",
      A > q67 ~ "最高33%"
    ) %>% factor(levels = c("最低33%", "33-67%", "最高33%"))
  ) %>%
  ungroup() %>%
  select(-q33, -q67) # 移除临时计算的分位数列

方法3:修正quantcut的使用

调整probs参数并结合分组,实现需求:

library(tidyverse)
library(gtools)

df <- df %>%
  group_by(year) %>%
  mutate(B = quantcut(A, 
                      probs = c(0, 0.33, 0.67, 1), # 正确的分位概率点
                      labels = c("最低33%", "33-67%", "最高33%"),
                      include.lowest = TRUE)) %>% # 包含最小值所在区间
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:45:14