如何找出两个data.table数据集中仅出现一次的行?
问题描述
我有如下数据:
library(data.table) datA <- fread("A B C 1 1 1 2 2 2") datB <- fread("A B C 1 1 1 2 2 2 3 3 3")
我想要找出仅出现一次的行(也就是3 3 3这一行,因为其他行都出现了多次)。
我试了下面几种方法:
dat <- rbind(datA, datB) unique(dat) !duplicated(dat)
还试了这个:
setDT(dat)[,if(.N ==1) .SD,]
但结果返回的是NULL,请问正确的实现方式是什么?
解决方法
你之前的setDT(dat)[,if(.N ==1) .SD,]返回NULL,是因为没有指定分组依据——默认情况下整个数据表是一个分组,.N等于总行数5,显然不等于1,所以返回空值。要实现需求,必须按所有列的组合分组,统计每组的出现次数,再筛选出仅出现一次的组。
这里提供两种简洁的实现方式:
方式一:明确指定分组列
dat <- rbind(datA, datB) # 先统计每组行数,再筛选行数为1的行并移除计数列N setDT(dat)[, .N, by = .(A,B,C)][N == 1, !"N"] # 或者直接在分组后返回目标行 setDT(dat)[, if(.N == 1) .SD, by = .(A,B,C)]
方式二:自动获取所有列作为分组键(适合列数多的场景)
如果数据表列数很多,手动写所有列名太麻烦,可以用names(dat)自动获取全部列名作为分组依据:
dat <- rbind(datA, datB) setDT(dat)[, if(.N == 1) .SD, by = names(dat)]
另外补充说明下你之前尝试的方法为什么不符合需求:
unique(dat)只会返回所有不重复的行,但无法区分这些行是出现一次还是多次;!duplicated(dat)仅标记每行第一次出现的位置,同样不能筛选出仅出现一次的行。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

