You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:30:51