R使用expandRows扩展行后按原行分组生成顺序编号列的问题
问题原因
你原来的代码无法得到预期结果的核心问题是分组依据错误:你直接按RowID字段分组,但每一行的RowID都是唯一值,分组后每组仅1行,完全达不到「小数点前数值相同的行分为一组」的需求,你需要先从RowID中提取小数点前的原始行号作为分组字段。
正确实现代码
方法1:基于现有RowID字段处理
用正则提取RowID中.前面的部分作为分组键,再生成组内序号:
library(dplyr) library(stringr) data <- data %>% # 提取小数点前的数字作为分组ID mutate(group_id = str_extract(RowID, "^\\d+")) %>% # 按group_id分组 group_by(group_id) %>% # 生成组内序号 mutate(id = row_number()) %>% # 可选:删除临时生成的group_id列 ungroup() %>% select(-group_id)
方法2:更高效的无依赖方案
其实你调用expandRows的时候就可以直接生成序号,不需要后续处理行名,代码更简洁也不容易出错:
# 生成扩展行时直接添加组内序号 data <- expandRows(data, "MaxRounds", count.is.col = FALSE) %>% group_by(power, nights, sites, NonRoundedMaxRounds) %>% mutate(id = row_number()) %>% ungroup()
输出效果示例
处理后的数据会新增id列,完全符合你的预期:
| power | nights | sites | NonRoundedMaxRounds | RowID | id |
|---|---|---|---|---|---|
| 0.800962297001584 | 20 | 78 | 3 | 1 | 1 |
| 0.800962297001584 | 20 | 78 | 3 | 1.1 | 2 |
| 0.800962297001584 | 20 | 78 | 3 | 1.2 | 3 |
| 0.804719517260326 | 20 | 79 | 3 | 2 | 1 |
| 0.804719517260326 | 20 | 79 | 3 | 2.1 | 2 |
| 0.804719517260326 | 20 | 79 | 3 | 2.2 | 3 |
内容的提问来源于stack exchange,提问作者Leanne Greenwild
相关产品推荐
相关产品推荐

