R语言数据处理需求:分组取最小价格并实现宽表转换
R语言数据分组筛选与重塑解决方案
初始数据与现有代码
用户提供的初始数据框:
df <- data.frame( code1 = c("ZAZ","ZAZ","ZAZ","ZAZ","ZAZ","ZAZ","JOZ","JOZ","JOZ","JOZ","JOZ","JOZ","TSV","TSV"), code2 = c("NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","NAN","TSA","TSA"), start = c("Date1.1","Date1.1","Date1.3","Date1.3","Date1.5","Date1.5","Date3.1","Date3.1","Date3.3","Date3.3","Date3.5","Date3.5","Date 5.1","Date 5.1"), end = c("Date2.1","Date2.1","Date2.3","Date2.3","Date2.5","Date2.5","Date4.1","Date4.1","Date4.3","Date4.3","Date4.5","Date4.5","Date6.1","Date6.1"), price = c(1,2,3,4,5,6,1,2,3,4,5,6,1,2) )
已编写的代码片段:
df <- df %>% group_by(code1, code2,start,end) %>% slice_min(price) #%>% #group_modify() df <- df[order(df$price),]
需求1:分组筛选每组最小price记录
你的现有代码已经完成了核心逻辑,这里优化一下命名和分组状态:
df_filtered <- df %>% group_by(code1, code2, start, end) %>% slice_min(price) %>% ungroup() # 取消分组,避免后续操作受分组状态影响
执行后,每个(code1, code2, start, end)组合只会保留price最小的行,比如ZAZ-NAN-Date1.1-Date2.1组会留下price=1的记录。
需求2:以code1、code2为键重塑数据(最多3组start/end/price)
结合group_modify()实现分组重塑,具体代码和说明如下:
完整实现代码
df_reshaped <- df_filtered %>% group_by(code1, code2) %>% # 为每个分组内的记录添加序号(1到3,不足3条的后续自动填充NA) mutate(row_num = row_number()) %>% # 使用group_modify处理每个分组 group_modify(function(.x, .y) { # 将当前分组的长格式数据转为宽格式 .x %>% pivot_wider( names_from = row_num, values_from = c(start, end, price), names_glue = "{.value}{row_num}" # 生成start1、end1、price1这类列名 ) }) %>% ungroup()
group_modify()用法说明
group_modify()需要传入一个自定义函数,函数包含两个固定参数:.x:当前分组对应的子数据框(比如code1=ZAZ, code2=NAN的所有筛选后记录).y:当前分组的键值信息(这里是包含code1和code2的单行数据框)
- 在函数内部,我们用
pivot_wider()将每个分组的长格式数据转为宽格式,最多生成3组start/end/price列,分组内记录不足3条的列会自动填充NA。
最终结果示例
df_reshaped的结构如下(截取部分行):
| code1 | code2 | start1 | end1 | price1 | start2 | end2 | price2 | start3 | end3 | price3 |
|---|---|---|---|---|---|---|---|---|---|---|
| ZAZ | NAN | Date1.1 | Date2.1 | 1 | Date1.3 | Date2.3 | 3 | Date1.5 | Date2.5 | 5 |
| JOZ | NAN | Date3.1 | Date4.1 | 1 | Date3.3 | Date4.3 | 3 | Date3.5 | Date4.5 | 5 |
| TSV | TSA | Date 5.1 | Date6.1 | 1 | NA | NA | NA | NA | NA | NA |
内容的提问来源于stack exchange,提问作者JohnDoe34
相关产品推荐
相关产品推荐

