通过 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)))]
}
我有一个在三个时间点有两个人的数据框(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 做到这一点?
我们可能会发现 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)))]
}