我有一个像这样的数据框:
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,低于所有其他组合。
您不需要进行所有比较(也可以让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)