使用 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
我有以下示例数据:
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