如何用data.table生成按唯一class值计数的fid列以实现长表转宽?
用data.table创建分组计数的fid列
当然有啦!用data.table来实现这个分组内生成序号的需求超方便,核心是利用它的分组操作和内置变量.N(代表每个分组的行数),下面给你完整的代码示例和说明:
步骤1:准备数据(补全你提供的示例数据)
先把你的示例数据补全,方便演示:
library(data.table) # 补全后的示例数据 df <- data.frame( class = c('1', '1', '1', '2', '3', '3'), A = 1:6, B = 1:6 # 补全B列的数值 )
步骤2:转换为data.table并生成fid列
直接用data.table的语法,按class分组后生成从1开始的序号列:
# 将data.frame转换为data.table(in-place修改,不占用额外内存) setDT(df) # 按class分组,生成fid列 df[, fid := seq_len(.N), by = class]
运行结果展示
执行完上面的代码后,查看数据框:
print(df)
输出会是这样:
class A B fid 1: 1 1 1 1 2: 1 2 2 2 3: 1 3 3 3 4: 2 4 4 1 5: 3 5 5 1 6: 3 6 6 2
关键说明
by = class:指定按照class列的唯一值进行分组.N:data.table的内置变量,代表当前分组的行数seq_len(.N):生成从1到当前分组行数的整数序列,正好满足你需要的“每个class唯一值从1计数到分组长度”的需求
如果你的数据一开始就是data.table对象,直接跳过setDT(df)这一步,直接执行分组赋值操作就行~
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

