如何统计大数据表中指定列的每行重复记录数?
计算data.table指定列每行的重复记录数量
嘿,针对你在大数据表(data.table)里统计指定列每行重复记录数量的需求,我可以给你几个实用的高效实现方案——毕竟data.table的分组操作处理大表可是强项,完全不用担心性能问题!
下面分几种常见的场景来对应你的需求(毕竟“重复记录数量”可能有不同的定义):
场景1:统计每行指定列值的总出现次数
如果你想知道每行的指定列值在整个列中一共出现了多少次(比如值1出现2次,那么所有值为1的行都会显示2),直接用data.table的.N(分组内的行数)就能搞定:
library(data.table) # 你的示例数据表 test <- data.table(a=c(1,2,3),b=c(1,4,6),c=c(5,6,9)) # 针对列a,计算每行值的总出现次数,新增duplicatercds列 test[, duplicatercds := .N, by = a]
执行后得到的结果:
a b c duplicatercds 1: 1 1 5 1 2: 2 4 6 1 3: 3 6 9 1
场景2:统计每行指定列值的实际重复次数(总次数-1)
如果“重复记录数量”指的是该值除了自身之外的重复次数(也就是总出现次数减1,比如值出现3次,重复次数就是2),只需对.N做个减法:
test[, duplicatercds := .N - 1, by = a]
对应的结果:
a b c duplicatercds 1: 1 1 5 0 2: 2 4 6 0 3: 3 6 9 0
场景3:标记该行是否属于存在重复的组(有重复则为1,否则0)
看你的示例里duplicatercds=c(1,0,0),可能你是想标记该行的列值是否存在重复(比如假设列a中1出现多次,所以标记为1)。这种情况可以判断分组内的行数是否大于1:
# 先修改示例数据,让a列有重复值,更贴合场景 test <- data.table(a=c(1,1,3),b=c(1,4,6),c=c(5,6,9)) # 标记是否存在重复 test[, duplicatercds := as.integer(.N > 1), by = a]
执行后结果:
a b c duplicatercds 1: 1 1 5 1 2: 1 4 6 1 3: 3 6 9 0
场景4:标记该行是否是首次出现之外的重复行
如果你的需求是只把重复出现的行(非首次出现的那些)标记为1,首次出现的标记为0,用rowid()函数就能轻松实现:
test[, duplicatercds := as.integer(rowid(a) > 1), by = a]
对应的结果:
a b c duplicatercds 1: 1 1 5 0 2: 1 4 6 1 3: 3 6 9 0
这些方法都是data.table原生的高效操作,完全适配大数据表的处理,不会因为数据量增大而变慢,放心用就好!
内容的提问来源于stack exchange,提问作者User878239
相关产品推荐
相关产品推荐

