我有一个数据集 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_visitvisit_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_visitclosest_visit 对于第七行是 1,因为 0(该行的 visit_id)比 7(该参与者的 true_visit s)更接近 1,依此类推。

我试着寻找 hereherehere 。他们是一个好的开始,但不是我正在寻找的。有任何想法吗?

最佳答案

可以去:

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/

10-12 23:21