通过 id(纵向数据)创建具有案例之间链接的新变量

Creating new variables with links between cases via id's (longitudinal data)

我有一个在三个时间点有两个人的数据框(3x“id”==1 和 3x“id”==2):

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

  id id2 x
1  1  NA 4
2  1  NA 5
3  1  NA 5
4  2   1 1
5  2   1 1
6  2   1 1

现在我想用以下规则创建一个新变量“y”:如果“id2”不是 NA,“y”应该是“id2”的人最常出现的“x”的值==“身份”。在此示例数据中:对于所有时间点,“id”== 2 的人在“y”中得到 5,因为人 2 在“id2”中有 1,而 5 是此人最常出现的数字其中“id”== 1。由于“id2”对于第 1 个人是 NA,因此“y”也将是 NA(第 1 个人没有其他人可以参考)。结果是:

  id id2 x y
1  1  NA 4 NA
2  1  NA 5 NA
3  1  NA 5 NA
4  2   1 1 5
5  2   1 1 5
6  2   1 1 5

有没有办法用 dplyr 做到这一点?

我们可能会发现 按 'id' 分组,然后 match 'id2' 与 'id' 并替换为 'Mode' 值

library(dplyr)
dat1 %>% 
    group_by(id) %>%
    mutate(tmp = Mode(x)) %>% 
    ungroup %>%
    mutate(y= tmp[match(id2, id)], tmp = NULL)

哪里

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}