根据多个变量重新编码单个变量

时间:2019-03-19 11:11:20

标签: r

我有一个超过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”列中)相同,必须满足以下条件:

  • 要复制的行ID值必须来自具有Order的行 “第一”
  • 具有新ID值的行必须来自具有以下顺序的行 “重做”
  • 它们在"name" + "age" + "group" + "site"列中具有相同的值
  • 具有新ID值的行的日期必须是发生的日期 在“第一”之后

最终数据集应如下所示:

      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

1 个答案:

答案 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)

如果是,您可以例如决定一个时间窗口,在该时间窗口中您将后续条目归因于任一患者,或者将所有“重做”条目归因于直到第二个“第一个”归因于第一个患者,而所有其他归因于下一个归因,或者仅排除所有多人项,分别取决于此处的准确性和完整性的重要性。