R - 计算重复行,保留其首次出现的索引

时间:2015-11-26 10:00:58

标签: r duplicates indices rowname

我一直在寻找一种有效的方法来计算和删除数据框中的重复行,同时保留它们第一次出现的索引。 例如,如果我有一个数据框:

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

&#34;重复&#34;返回原始的rownames(此处为{1 2 3 5 6 8}),但不计算出现的次数。我尝试自己编写函数,但它们都不足以处理大数据。我的数据框可以有多达几百万行(尽管列通常是5到10行)。

2 个答案:

答案 0 :(得分:2)

我们可以尝试使用setTimeout(function(){ var elements = document.getElementsByClassName('alert'); while(elements.length > 0){ elements[0].parentNode.removeChild(elements[0]); } },500); 。我们将'data.frame'转换为'data.table'(data.table),按'x','y'列分组,我们得到nrow(setDT(df))。

.N

如果我们需要行ID,

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

或者

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

答案 1 :(得分: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 s unique方法

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