R 查找唯一行

R 查找唯一行,r,dataframe,duplicates,unique,R,Dataframe,Duplicates,Unique,这看起来很简单,但我想不出来 给定这个数据帧 df=data.frame( x = c(12,12,165,165,115,148,148,155,155,521), y = c(54,54,122,122,215,108,108,655,655,151) ) df x y 1 12 54 2 12 54 3 165 122 4 165 122 5 115 215 6 148 108 7 148 108 8 155 655 9 155 6

这看起来很简单,但我想不出来

给定这个数据帧

df=data.frame(
  x = c(12,12,165,165,115,148,148,155,155,521),
  y = c(54,54,122,122,215,108,108,655,655,151)  
)


 df
     x   y
1   12  54
2   12  54
3  165 122
4  165 122
5  115 215
6  148 108
7  148 108
8  155 655
9  155 655
10 521 151
现在,如何获取只存在一次的行。那是第5排和第10排。行的顺序可以完全任意,因此检查“下一行”不是一个选项。我尝试了很多方法,但在我的data.frame上没有任何效果,它有大约4万行


我有一个解决方案处理data.frame的一个子集(~1k行),这需要3分钟来处理。因此,我的解决方案需要在我的原始data.frame上花费120分钟,这是不合适的。有人能帮忙吗?

使用
dplyr
的解决方案
df2
是最终输出

library(dplyr)
df2 <- df %>%
  count(x, y) %>%
  filter(n == 1) %>%
  select(-n)
库(dplyr)
df2%
计数(x,y)%>%
过滤器(n==1)%>%
选择(-n)

带有
表格的解决方案

library(dplyr)
table(df) %>% as.data.frame %>% subset(Freq ==1) %>% select(-3)
或者,如您在评论中所述,对于base,您不希望加载包:

subset(as.data.frame(table(df)),Freq ==1)[,-3]
另外,我认为
data.table
对于大数据集和过滤来说非常快,所以这可能也值得一试,因为您提到了速度:

df2 <- copy(df)
df2 <- setDT(df2)[, COUNT := .N, by='x,y'][COUNT ==1][,c("x","y")]

df2从数据帧的开头和结尾检查
duplicated
,如果没有返回true,则选择它:

df[!(duplicated(df) | duplicated(df, fromLast = TRUE)),]

#     x   y
#5  115 215
#10 521 151

另一个base R解决方案,使用
ave
计算每行的总出现次数,并仅对
1
时间出现的次数进行子集。也可以针对出现特定次数的子集行进行修改

df[ave(1:NROW(df), df, FUN = length) == 1,]
#     x   y
#5  115 215
#10 521 151

如果您只是在寻找一种快速的可视化方法,那么可以使用
table(df$x,df$y)
。这不会返回行号,而是返回一个矩阵,其中行中包含
x
值,列中包含
y
值。这个问题以前被问过好几次,例如,谷歌快速搜索返回:。谢谢你的回答。不需要另一个lib是一个好处,因为这是在我们开发的包中使用的。
filter
,而不是
subset
,对吗?我从来没有得到过很大的区别,除了
subset
保留初始行号这一事实<代码>过滤器
也可以被其他包屏蔽,所以我通常使用
子集
。不好吗?不,一点也不坏。我还以为你想用dplyr风格来做呢。为什么
subset
不是dplyr风格:)?你的意思是它是基函数?这是相关的,简而言之,过滤器丢弃行名称对于较大的数据集更快(对于较小的数据集较慢),对于sql数据库更好: