根据特定条件删除重复ID

时间:2015-09-01 03:15:30

标签: r duplicates

id <-  c(1,1,2,3,4,4,5,6,7,7,7,8,9)
age <- c(10,10.6,11,11.3,10.9,11.4,10.7,11,10.5,11.1,12.3,10.3,10.7)
ageto11 <- abs(age-11)

df <- as.data.frame(cbind(id,age,ageto11))
df
   id  age ageto11
1   1 10.0     1.0
2   1 10.6     0.4
3   2 11.0     0.0
4   3 11.3     0.3
5   4 10.9     0.1
6   4 11.4     0.4
7   5 10.7     0.3
8   6 11.0     0.0
9   7 10.5     0.5
10  7 11.1     0.1
11  7 12.3     1.3
12  8 10.3     0.7
13  9 10.7     0.3

我试图根据选择11岁的最小距离(即ageto11的最小值)的标准,删除上述数据框中的重复id

例如,当id = 1时,我想删除第一行,其中ageto11更大。 当id = 7时,我想保留第10行,其中ageto11是最小的。

期望的结果应该是

   id  age ageto11
2   1 10.6     0.4
3   2 11.0     0.0
4   3 11.3     0.3
5   4 10.9     0.1
7   5 10.7     0.3
8   6 11.0     0.0
10  7 11.1     0.1
12  8 10.3     0.7
13  9 10.7     0.3 

1 个答案:

答案 0 :(得分:1)

我们将'data.frame'转换为'data.table'(setDT(df)),按'id'分组,得到'age'与11的差值,找到最小绝对值的索引(which.min(abs..)并对数据集(.SD)进行子集化。

library(data.table)
setDT(df)[,.SD[which.min(abs(age-11))] , id]
#    id  age ageto11
#1:  1 10.6     0.4
#2:  2 11.0     0.0
#3:  3 11.3     0.3
#4:  4 10.9     0.1
#5:  5 10.7     0.3
#6:  6 11.0     0.0
#7:  7 11.1     0.1
#8:  8 10.3     0.7
#9:  9 10.7     0.3

编辑:刚刚通知@Pascal,距离已经在'ageto11'计算。在那种情况下

setDT(df)[, .SD[which.min(ageto11)], id]