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

