找到唯一的行

时间:2017-07-28 20:36:50

标签: 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 655
10 521 151

现在,我如何获得仅存在一次的行。这是第5行和第10行。行的顺序可以是完全任意的,因此检查" next"行不是一个选项。我尝试了很多东西,但是我的data.frame没有任何工作,它有大约40k行。

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

4 个答案:

答案 0 :(得分:6)

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

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

#     x   y
#5  115 215
#10 521 151

答案 1 :(得分:1)

table

的解决方案
library(dplyr)
table(df) %>% as.data.frame %>% subset(Freq ==1) %>% select(-3)

或者如您在评论中所说的那样,您不想加载包:

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")]

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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