如何用dplyr将数据框中重启序列替换为对应组编号?
用dplyr实现递增序列的分组编号
哈哈,这个需求我太熟了!本质就是根据序列的下降断点来划分组,用dplyr完全可以写出超简洁的实现,我给你一步步讲清楚:
核心思路
我们要做的就是:
- 检测每一行的
V1是否比前一行小(下降的断点就是新组的起点) - 把这些断点标记累加起来,就能得到连续的组编号
具体实现代码
先模拟一个和你描述一致的数据集(方便你直接测试):
library(dplyr) # 模拟数据:V1递增,下降时开启新组 df <- tibble(V1 = c(1, 2, 3, 4, 2, 3, 5, 1, 2))
然后用一行dplyr代码生成组编号(可以选择新增列或者替换原列):
新增组编号列
df <- df %>% mutate( group_id = cumsum(V1 < lag(V1, default = first(V1))) + 1 )
直接替换原V1列
如果想直接把V1换成组编号,只需要把变量名改成V1就行:
df <- df %>% mutate( V1 = cumsum(V1 < lag(V1, default = first(V1))) + 1 )
代码解释
lag(V1, default = first(V1)):把第一行的"前一个值"设为它自己,这样第一行不会被误判为新组V1 < lag(...):生成一个逻辑向量,下降的位置会返回TRUE(相当于1),其他位置是FALSE(相当于0)cumsum():累加这些1和0,每遇到一个下降断点就加1,自然形成连续的组编号- 最后
+1是为了让组号从1开始(如果不加会从0开始,也可以根据你的需求调整)
测试结果
用上面的模拟数据,运行后会得到:
| V1 | group_id |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 1 |
| 2 | 2 |
| 3 | 2 |
| 5 | 2 |
| 1 | 3 |
| 2 | 3 |
完全符合你要的分组逻辑,350行的数据量用这个方法毫无压力,速度快还易懂!
内容的提问来源于stack exchange,提问作者mysteRious
相关产品推荐
相关产品推荐

