我有一个像这样的数据框:
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
在此数据框中,每个人都id可以有几个观察结果。现在,我想为每个选择id对的绝对差最小的对(2个观测值)vars。
在上述情况下,
  id vars
1  1    1
2  1    2
3  2    1
4  2    3
5  3    0
6  3   -1
对于id1,值1和2具有最小的绝对差,
 id2仅具有2个观测值,因此两者都是自动选择的。对于id3个,所选的var将为0和-1,因为绝对差为1,低于所有其他组合。
您不需要进行所有比较(也可以让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
数据表版本
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
| 归档时间: | 
 | 
| 查看次数: | 81 次 | 
| 最近记录: |