这看起来很简单,但我无法弄清楚。
给定此数据框
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,这是不合适的。有人可以帮忙吗?
答案 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