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数据库更好: