使用 id 链接纵向数据中不同案例的新变量

New variables using id's linking different cases in longidutinal data

我有以下示例数据:

id <- c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4)
id2 <- c(-1, -1, -1, 1, 1, 1, -1, -1, -1, 3, 3, 3)
x <- c(4, 5, 5, 1, 1, 1, 7, NA, 9, 2, 2, 2)
dat1 <- data.frame(id, id2, x)
dat1

> dat1
   id id2 x
1   1  -1 4
2   1  -1 5
3   1  -1 5
4   2   1 1
5   2   1 1
6   2   1 1
7   3  -1 7
8   3  -1 NA
9   3  -1 9
10  4   3 2
11  4   3 2
12  4   3 2

“id”在三个时间点指的是三个不同的人。 “id2”是一个link之间的不同人;人1(id == 1)没有link(id2 == -1),人2(id == 2)指人1(id2 == 1),人3(id == 3)没有 link (id3 == -1) 并且人 4 指的是人 3 (id2 == 3).

现在我想用这个规则创建一个新变量“y”:对于一个人(id 1、2 或 3),“y”应该总是另一个人的“x”的值,这可以通过“id2”来识别。这意味着:对于“id”== 2 的人,“y”是 c(4,5,5),对于“id”==4 的人,“y”是 c(7,NA,9)。因为对于“id”== 1 和 3 的人没有匹配项,在这种情况下“y”将是“-1”(它也可能是“NA”,多余的)。之后,dat1 应该如下所示:

   id id2 x  y
1   1  -1 4 -1
2   1  -1 5 -1
3   1  -1 5 -1
4   2   1 1  4
5   2   1 1  5
6   2   1 1  5
7   3  -1 7 -1
8   3  -1 NA-1
9   3  -1 9 -1
10  4   3 2  7
11  4   3 2  NA
12  4   3 2  9

如何用 dplyr 做到这一点?

你可以使用自left_join加上一些小的调整。

library(dplyr)

# add row specification for each id
dat1 <- dat1 %>% group_by(id) %>% mutate(row = row_number()) %>% ungroup()


dat1 %>% 
  left_join(select(dat1, row, id2 = id, y = x), by = c("row", "id2")) %>% 
  select(-row) %>% 
  mutate(y = if_else(id2 == -1, -1, y))

#> # A tibble: 12 x 4
#>       id   id2     x     y
#>    <dbl> <dbl> <dbl> <dbl>
#>  1     1    -1     4    -1
#>  2     1    -1     5    -1
#>  3     1    -1     5    -1
#>  4     2     1     1     4
#>  5     2     1     1     5
#>  6     2     1     1     5
#>  7     3    -1     7    -1
#>  8     3    -1    NA    -1
#>  9     3    -1     9    -1
#> 10     4     3     2     7
#> 11     4     3     2    NA
#> 12     4     3     2     9