【问题标题】:remove duplicate id based on certain criteria [duplicate]根据某些标准删除重复的 id [重复]
【发布时间】:2015-09-01 03:15:29
【问题描述】:
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 

【问题讨论】:

    标签: r duplicates


    【解决方案1】:

    我们将'data.frame'转换为'data.table'(setDT(df)),按'id'分组,得到'age'与11的差,找到最小绝对值的索引(@ 987654322@) 和子集数据集 (.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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-14
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      相关资源
      最近更新 更多