2015-11-26 74 views
1

我一直在寻找一种有效的方法来统计和删除数据框中的重复行,同时保留首次出现的索引。 举例来说,如果我有一个数据帧:R - 保留其首次出现索引的计数重复行

df<-data.frame(x=c(9.3,5.1,0.6,0.6,8.5,1.3,1.3,10.8),y=c(2.4,7.1,4.2,4.2,3.2,8.1,8.1,5.9)) 
ddply(df,names(df),nrow) 

给我

x y V1 
1 0.6 4.2 2 
2 1.3 8.1 2 
3 5.1 7.1 1 
4 8.5 3.2 1 
5 9.3 2.4 1 
6 10.8 5.9 1 

但我想保持复制行的原始指标(与该行的名字一起)。像:

x y V1 
1 9.3 2.4 1 
2 5.1 7.1 1 
3 0.6 4.2 2 
5 8.5 3.2 1 
6 1.3 8.1 2 
8 10.8 5.9 1 

“复制” 返回原始rownames(此处{1 2 3 5 6 8}),但犯规数OCCURENCES的数量。我试着自己编写函数,但没有一个能够处理大数据。我的数据框可以有几百万行(尽管列通常是5到10)。

+0

我想你从你的解决方案从重复的职位。我想知道为什么你没有仔细研究其余的解决方案。 –

+0

我看过很多解决方案,但无法找到“保持重复的第一次出现”的地方。由于我无权在旧帖子中添加评论,并且在“答案”框中询问“问题”会出错,所以我必须创建一个新帖子。经过6天的努力,我问了这个问题。 – Ira

+0

哦,我明白了。我没有注意到你也想要你的行名。 –

回答

2

如果你想保持指数:

library(data.table) 
setDT(df)[,.(.I, .N), by = names(df)][!duplicated(df)] 
#  x y I N 
#1: 9.3 2.4 1 1 
#2: 5.1 7.1 2 1 
#3: 0.6 4.2 3 2 
#4: 8.5 3.2 5 1 
#5: 1.3 8.1 6 2 
#6: 10.8 5.9 8 1 

或者使用data.table小号unique方法

unique(setDT(df)[,.(.I, .N), by = names(df)], by = names(df)) 
+0

太棒了!这是我想要的。谢谢。我会更新我正在用其他方法比较他们所面临的效率问题。 – Ira

2

我们可以试着data.table。我们将'data.frame'转换为'data.table'(setDT(df)),按'x','y'列分组,我们得到了nrow(.N)。

library(data.table) 
setDT(df)[, list(V1=.N), by = .(x,y)] 
#  x y V1 
#1: 9.3 2.4 1 
#2: 5.1 7.1 1 
#3: 0.6 4.2 2 
#4: 8.5 3.2 1 
#5: 1.3 8.1 2 
#6: 10.8 5.9 1 

如果我们需要的行ID,

setDT(df)[, list(V1= .N, rn=.I[1L]), by = .(x,y)] 
#  x y V1 rn 
#1: 9.3 2.4 1 1 
#2: 5.1 7.1 1 2 
#3: 0.6 4.2 2 3 
#4: 8.5 3.2 1 5 
#5: 1.3 8.1 2 6 
#6: 10.8 5.9 1 8 

或者

setDT(df, keep.rownames=TRUE)[, list(V1=.N, rn[1L]), .(x,y)] 
+1

我觉得加'by'可以让阅读更容易。 –

+0

谢谢。但它并没有给出行名。我希望rownames是{1 2 3 5 6 8}。 – Ira

+1

@Ira更新后 – akrun