R - 计算重复的行,保留它们第一次出现的索引
R - Count duplicated rows keeping index of their first occurrences
我一直在寻找一种有效的方法来计算和删除数据框中的重复行,同时保留它们第一次出现的索引。
例如,如果我有一个数据框:
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
"duplicated" returns 原始行名(此处为 {1 2 3 5 6 8})但不计算出现次数。我尝试自己编写函数,但其中 none 足以有效处理大数据。我的数据框最多可以有几百万行(虽然列通常是 5 到 10)。
我们可以试试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)]
如果要保留索引:
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))
我一直在寻找一种有效的方法来计算和删除数据框中的重复行,同时保留它们第一次出现的索引。 例如,如果我有一个数据框:
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
"duplicated" returns 原始行名(此处为 {1 2 3 5 6 8})但不计算出现次数。我尝试自己编写函数,但其中 none 足以有效处理大数据。我的数据框最多可以有几百万行(虽然列通常是 5 到 10)。
我们可以试试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)]
如果要保留索引:
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))