查找唯一行

Find unique rows

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

给定这个数据框

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 行。行的顺序可以完全任意,因此检查 "next" 行不是一个选项。我尝试了很多东西,但在我的 data.frame 上没有任何效果,它有 ~40k 行。

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

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

library(dplyr)
df2 <- df %>%
  count(x, y) %>%
  filter(n == 1) %>%
  select(-n)

table

的解决方案
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")]

从数据帧的开始和结束检查duplicated,如果nonereturns为真,那么select就是:

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

#     x   y
#5  115 215
#10 521 151

另一个基础 R 解决方案,它使用 ave 来计算每一行的总出现次数,并且仅对出现 1 次的那些进行子集化。也可以修改它以对出现特定次数的行进行子集化。

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