R语言group_by后如何获取分组名称,实现按年份匹配区间?
解决分组匹配区间的问题
你原来的代码里无法直接用group_name获取分组标识,在dplyr的分组操作中,我们可以通过当前组的唯一year值来匹配table2中的breaks数据,以下是两种可行的实现方式:
方法一:利用cur_group()获取分组年份
library(dplyr) table1 <- table1 %>% group_by(year) %>% mutate( # 获取当前分组的年份 current_year = cur_group()$year, # 提取对应年份的breaks并转为向量 breaks_vec = table2[table2$year == current_year, 2:4] %>% pull(), # 划分区间并转为整数序号 interval = cut( size, breaks = breaks_vec, include.lowest = TRUE, # 让边界值划入对应区间 labels = 1:(length(breaks_vec)-1) ) %>% as.integer() ) %>% select(-current_year, -breaks_vec) # 清理临时列
方法二:简化分组内取值逻辑
因为每组的year是唯一的,直接用unique(year)就能定位对应年份的breaks,代码更简洁:
table1 <- table1 %>% group_by(year) %>% mutate( interval = cut( size, breaks = as.numeric(table2[table2$year == unique(year), 2:4]), include.lowest = TRUE, labels = 1:2 # 每个年份的breaks都是3个值,对应2个区间 ) %>% as.integer() )
关键细节说明
include.lowest = TRUE:确保1990年的3、1991年的5这类边界值被划入目标区间,和你给出的预期结果一致。- 将
cut返回的因子转为整数:直接得到你需要的区间序号(1或2),而非默认的区间字符串。
最终输出验证
运行代码后,table1会生成符合预期的结果:
| year | size | interval |
|---|---|---|
| 1990 | 4 | 2 |
| 1990 | 3 | 2 |
| 1991 | 1.6 | 1 |
| 1991 | 5 | 2 |
内容的提问来源于stack exchange,提问作者Daaaaa
相关产品推荐
相关产品推荐

