Исправление значения столбца на основе другого значения с помощью dplyr для каждого идентификатора - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть фрейм данных с person_ID, Job_ID, Municipality_code и некоторыми другими переменными (см. Пример фрейма данных ниже).Переменная Job_ID измеряется ежемесячно, а код муниципалитета - на год.

 as.data.frame(df)
   Person_ID Month Year Job_ID Municipality_code
1          1     1 2017   Job1                 1
2          1     2 2017   Job1                 1
3          1     3 2017   Job1                 1
4          1     4 2017   Job1                 1
5          1     5 2017   Job2                 1
6          1     6 2017   Job2                 1
7          1     7 2017   Job2                 1
8          1     8 2017   Job2                 1
9          1     9 2017   Job2                 1
10         1    10 2017   Job2                 1
11         1    11 2017   Job2                 1
12         1    12 2017   Job2                 1
13         1     1 2018   Job2                20
14         1     2 2018   Job2                20
15         1     3 2018   Job2                20
16         1     4 2018   Job2                20
17         1     5 2018   Job2                20
18         1     6 2018   Job2                20
19         1     7 2018   Job2                20
20         1     8 2018   Job2                20
21         1     9 2018   Job2                20
22         1    10 2018   Job2                20
23         1    11 2018   Job2                20
24         1    12 2018   Job2                20

Я хочу исправить код муниципалитета для каждого Person_ID на основе их идентификатора Job_ID.Например: мы заметили, что Person_ID 1 меняет работу в пятом месяце 2017 года (Job1 -> Job2).Из-за свойств Municipality_code код останется 1 (потому что на 1-2017 у нас был Job1 с соответствующим Municipality_code 1).Мне нужен кусок кода, который исправляет Municipality_code (таким образом, с 5/2017 нам нужно Municipality_code 20 вместо 1).Я попробовал следующий фрагмент кода, но мои усилия были напрасны.

df2 <- df %>% 
  group_by(Person_ID) %>%
  dplyr::mutate(lag = lag(Job_ID, default = NA, order_by = Job_ID), 
                Municipality_corrected = if_else(Job_ID == lag, Municipality_code[1], Municipality_code[2]))

И желаемый результат ...

Person_ID Month Year Job_ID Municipality_code  lag Municipality_corrected
1          1     1 2017   Job1                 1 <NA>                     NA
2          1     2 2017   Job1                 1 Job1                      1
3          1     3 2017   Job1                 1 Job1                      1
4          1     4 2017   Job1                 1 Job1                      1
5          1     5 2017   Job2                 1 Job1                      1
6          1     6 2017   Job2                 1 Job2                      20
7          1     7 2017   Job2                 1 Job2                      20
8          1     8 2017   Job2                 1 Job2                      20
9          1     9 2017   Job2                 1 Job2                      20
10         1    10 2017   Job2                 1 Job2                      20
11         1    11 2017   Job2                 1 Job2                      20
12         1    12 2017   Job2                 1 Job2                      20
13         1     1 2018   Job2                 20 Job2                     20
14         1     2 2018   Job2                 20 Job2                     20
15         1     3 2018   Job2                 20 Job2                     20
16         1     4 2018   Job2                 20 Job2                     20
17         1     5 2018   Job2                 20 Job2                     20
18         1     6 2018   Job2                 20 Job2                     20
19         1     7 2018   Job2                 20 Job2                     20
20         1     8 2018   Job2                 20 Job2                     20
21         1     9 2018   Job2                 20 Job2                     20
22         1    10 2018   Job2                 20 Job2                     20
23         1    11 2018   Job2                 20 Job2                     20
24         1    12 2018   Job2                 20 Job2                     20

1 Ответ

0 голосов
/ 27 ноября 2018

Следующее дает вам исправленное Municipality_code

df %>% 
  group_by(Person_ID, Job_ID) %>% 
  mutate(Municipality_corrected = last(Municipality_code))

# A tibble: 24 x 6
# Groups:   Person_ID, Job_ID [2]
#    Person_ID Month  Year Job_ID Municipality_code Municipality_corrected
#        <int> <int> <int> <chr>              <int>                  <int>
#  1         1     1  2017 Job1                   1                      1
#  2         1     2  2017 Job1                   1                      1
#  3         1     3  2017 Job1                   1                      1
#  4         1     4  2017 Job1                   1                      1
#  5         1     5  2017 Job2                   1                     20
#  6         1     6  2017 Job2                   1                     20
#  7         1     7  2017 Job2                   1                     20
#  8         1     8  2017 Job2                   1                     20
#  9         1     9  2017 Job2                   1                     20
# 10         1    10  2017 Job2                   1                     20
# ... with 14 more rows

Я использую идею, что муниципальный кодекс одинаков для каждой работы и, таким образом, группируется по Job_ID.Затем я беру последние Municipality_code для каждого Job_ID как исправленные.

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