我有一个超过150,000行和大约40个变量的数据集。在我的数据集中,每一行代表一个人的遭遇,并且每一行都有唯一的ID。但是,有些人会在一段时间内回来几次,所以我希望能够反映出这一点,以便唯一ID成为特定于该人而不是遇到的人。
这是一个示例数据集:
df <- data.frame(
ID = c(101:110),
Name = c("AA", "BB", "AA", "DD", "EE", "FF", "AA", "GG", "DD", "HH"),
Age = c(1, 56, 1, 72, 12, 43, 1, 32, 72, 99),
Group = c(1, 2, 1, 2, 1, 4, 1, 3, 2, 4),
Date = seq(from = as.Date("2019-01-01"), to = as.Date("2019-01-10"), by = 'day'),
Order = c("re-do", "first", "first", "first", "re-do", "first", "re-do", "first", "re-do", "first"),
Site = c(2, 54, 2, 522, 3, 490, 2, 23, 522, 21)
)
看起来像这样:
ID Name Age Group Date Order Site
1 101 AA 1 1 2019-01-01 re-do 2
2 102 BB 56 2 2019-01-02 first 54
3 103 AA 1 1 2019-01-03 first 2
4 104 DD 72 2 2019-01-04 first 522
5 105 EE 12 1 2019-01-05 re-do 3
6 106 FF 43 4 2019-01-06 first 490
7 107 AA 1 1 2019-01-07 re-do 2
8 108 GG 32 3 2019-01-08 first 23
9 109 DD 72 2 2019-01-09 re-do 522
10 110 HH 99 4 2019-01-10 first 21
为使列值(在“ ID”列中)相同,必须满足以下条件:
"name" + "age" + "group" + "site"
列中具有相同的值最终数据集应如下所示:
ID Name Age Group Date Order Site
<dbl> <fct> <dbl> <dbl> <date> <fct> <dbl>
1 101 AA 1 1 2019-01-01 re-do 2
2 102 BB 56 2 2019-01-02 first 54
3 103 AA 1 1 2019-01-03 first 2
4 104 DD 72 2 2019-01-04 first 522
5 105 EE 12 1 2019-01-05 re-do 3
6 106 FF 43 4 2019-01-06 first 490
7 103 AA 1 1 2019-01-07 re-do 2
8 108 GG 32 3 2019-01-08 first 23
9 104 DD 72 2 2019-01-09 re-do 522
10 110 HH 99 4 2019-01-10 first 21
答案 0 :(得分:1)
如果有多个患者的Name, Age, Group, Site
值相同,您想怎么做?
您的建议可以通过以下方式实现:
library(dplyr)
df %>%
group_by(Name, Age, Group, Site) %>%
mutate(first_date = ifelse(Order == "first",
Date,
Date[Order == "first"])) %>%
mutate(ID = ifelse(n() > 1 & Date >= first_date,
ID[Order == "first"],
ID)) %>%
select(-first_date)
但是,如果您有多个病人在重做任务,则可能会将随后的“重做”条目归因于错误的病人。您可能要检查这种情况是否完全发生:
df %>%
filter(Order == "first") %>%
group_by(Name, Age, Group, Site) %>%
filter(n() > 1)
如果是,您可以例如决定一个时间窗口,在该时间窗口中您将后续条目归因于任一患者,或者将所有“重做”条目归因于直到第二个“第一个”归因于第一个患者,而所有其他归因于下一个归因,或者仅排除所有多人项,分别取决于此处的准确性和完整性的重要性。