我有一个数据集 df
:
df <- tibble(
id = sort(rep(letters[1:3], 3)),
visit_id = rep(c(0, 5, 10), 3),
true_visit = c(NA, 3, NA, 0, 5, 10, 1, 7, NA)
)
> df
# A tibble: 9 x 3
id visit_id true_visit
<chr> <dbl> <dbl>
1 a 0 NA
2 a 5 3
3 a 10 NA
4 b 0 0
5 b 5 5
6 b 10 10
7 c 0 1
8 c 5 7
9 c 10 NA
我正在尝试创建一个新列
closest_visit
,我在其中找到每个人中最接近 true_visit
的 visit_id
。结果将如下所示:# A tibble: 9 x 4
id visit_id true_visit closest_visit
<chr> <dbl> <dbl> <dbl>
1 a 0 NA 3
2 a 5 3 3
3 a 10 NA 3
4 b 0 0 0
5 b 5 5 5
6 b 10 10 10
7 c 0 1 1
8 c 5 7 7
9 c 10 NA 7
澄清一下,
closest_visit
对于单个 a
是 3 ,因为它是唯一的 true_visit
。 closest_visit
对于第七行是 1,因为 0(该行的 visit_id
)比 7(该参与者的 true_visit
s)更接近 1,依此类推。我试着寻找 here 、 here 和 here 。他们是一个好的开始,但不是我正在寻找的。有任何想法吗?
最佳答案
可以去:
library(dplyr)
df %>%
group_by(id) %>%
mutate(
closest_visit = case_when(
visit_id == true_visit ~ true_visit,
TRUE ~ true_visit[sapply(visit_id,
function(x) which.min(abs(x - true_visit)))]
)
)
输出:
# A tibble: 9 x 4
# Groups: id [3]
id visit_id true_visit closest_visit
<chr> <dbl> <dbl> <dbl>
1 a 0 NA 3
2 a 5 3 3
3 a 10 NA 3
4 b 0 0 0
5 b 5 5 5
6 b 10 10 10
7 c 0 1 1
8 c 5 7 7
9 c 10 NA 7
关于r - 按组查找数据帧中向量之间的最接近值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58663659/