选择绝对差异最小的重复行观察

spo*_*234 4 r dataframe dplyr

我有一个像这样的数据框:

df <- data.frame(id = c(1,1,1,2,2,3,3,3,3),
                  vars = c(1,2,5, 1,3, 0,2,4,-1))

> df
  id vars
1  1    1
2  1    2
3  1    5
4  2    1
5  2    3
6  3    0
7  3    2
8  3    4
9  3   -1
Run Code Online (Sandbox Code Playgroud)

在此数据框中,每个人都id可以有几个观察结果。现在,我想为每个选择id对的绝对差最小的对(2个观测值)vars

在上述情况下,

  id vars
1  1    1
2  1    2
3  2    1
4  2    3
5  3    0
6  3   -1
Run Code Online (Sandbox Code Playgroud)

对于id1,值1和2具有最小的绝对差, id2仅具有2个观测值,因此两者都是自动选择的。对于id3个,所选的var将为0和-1,因为绝对差为1,低于所有其他组合。

Ice*_*can 8

您不需要进行所有比较(也可以让arrange您自己进行比较),因为对值进行排序后,每个值就已经在使差异最小化的值旁边。

df %>% 
  group_by(id) %>% 
  arrange(vars) %>% 
  slice(which.min(diff(vars)) + 0:1)

# # A tibble: 6 x 2
# # Groups:   id [3]
#      id  vars
#   <dbl> <dbl>
# 1     1     1
# 2     1     2
# 3     2     1
# 4     2     3
# 5     3    -1
# 6     3     0
Run Code Online (Sandbox Code Playgroud)

数据表版本

library(data.table)
setDT(df)

df[df[order(vars), .I[which.min(diff(vars)) + 0:1], id]$V1]

#    id vars
# 1:  3   -1
# 2:  3    0
# 3:  1    1
# 4:  1    2
# 5:  2    1
# 6:  2    3
Run Code Online (Sandbox Code Playgroud)