如何用rleid对data.table分组:首行、末行及中间行分三组
用data.table的rleid实现首尾行单独分组的方案
没问题,这就帮你实现把data.table分成「首行、中间所有行、末行」三组的需求,用rleid完全可以轻松搞定,给你具体的代码和解释:
1. 先构造示例数据
首先我们先创建一个测试用的data.table,方便你验证效果:
library(data.table) dt <- data.table(value = 1:10) # 生成10行的示例表
2. 核心分组代码
利用data.table内置的.I(当前行索引)和.N(表的总行数)两个特殊变量,结合rleid来生成分组ID:
dt[, group := rleid( fcase( .I == 1, 1L, # 第一行标记为1 .I == .N, 3L, # 最后一行标记为3 default = 2L # 中间所有行标记为2 ) )]
或者你也可以用更传统的if-else写法,效果是一样的:
dt[, group := rleid( if (.I == 1) 1L else if (.I == .N) 3L else 2L )]
3. 验证结果
运行完代码后,你的dt会变成这样:
value group 1: 1 1 2: 2 2 3: 3 2 4: 4 2 5: 5 2 6: 6 2 7: 7 2 8: 8 2 9: 9 2 10: 10 3
完美实现了「首行一组、中间行一组、末行一组」的需求。
小提示
.I和.N是data.table的内置变量,不管你的表有多少列、列名是什么,这个逻辑都能直接复用fcase是data.table推荐的条件判断函数,比嵌套if-else更清晰易读,尤其是当条件复杂的时候
内容的提问来源于stack exchange,提问作者Victor Johnzon
相关产品推荐
相关产品推荐

