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
答案 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]