Запись одной переменной на основе нескольких переменных - PullRequest
0 голосов
/ 19 марта 2019

У меня есть набор данных с более чем 150000 строк и около 40 переменных.В моем наборе данных каждая строка представляет встречу с человеком, и у каждого есть уникальный идентификатор.Тем не менее, некоторые люди возвращаются несколько раз в течение определенного периода времени, и я хотел бы иметь возможность отразить это так, чтобы уникальный идентификатор стал специфическим для индивидуума, а не для встречи.

Вот примерный набор данных:

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») было одинаковым, должны быть выполнены следующие условия:

  • Значение идентификатора строки, которая должна быть скопирована, должно быть из строки с Порядком "first"
  • Строки, имеющие новое значение идентификатора, должны быть изстрока с порядком «re-do»
  • Они должны иметь одинаковые значения в столбцах "name" + "age" + "group" + "site"
  • Дата строк с новым значением ID должна быть датой, следующей за"first"

Окончательный набор данных должен выглядеть следующим образом:

      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 Ответ

1 голос
/ 19 марта 2019

Что бы вы хотели сделать, если бы более одного пациента имели одинаковые значения для 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)

Если да, вы можете, например, выбрать временной интервал, в течение которого вы будете приписывать последующие записи одному из пациентов, или приписывать все записи повторного выполнения до второго «первого» первому пациенту, а все остальные - следующему, или просто исключить все несколько человек записи, в зависимости от того, насколько важны точность и полнота здесь, соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...