Создайте новый фрейм данных из существующих фреймов данных в R

#r #dataframe #merge

#r #фрейм данных #объединение

Вопрос:

Предположим, у меня есть следующий фрейм данных df_week, который каждую неделю предоставляет подробную информацию о заданиях в отделах:

 Week Department Job Value
1    A          a1  10
1    A          a2  12
2    B          b1  9
3    A          a1  14
3    C          c1  8
4    A          a2  9
5    B          b1  13
5    B          b2  13
5    D          d1  7
5    E          e1  8
  

Теперь у меня также есть другой фрейм данных df_job, который предоставляет некоторую информацию о самих заданиях:

 Job Days
a1  5
a2  3
b1  3
b2  2
b3  3
b4  5
c1  3
c2  2
c3  4
d1  4
d2  6
e1  2
e2  3
e3  2
  

Что я хотел бы сделать, так это создать новый фрейм данных, в котором каждую неделю перечисляются все детали задания, вот так:

 Week Department Job Value Days
1    A          a1  10    5
1    A          a2  12    3 
1    B          b1  NA    3
1    B          b2  NA    2
1    B          b3  NA    3
1    B          b4  NA    5
1    C          c1  NA    3
1    C          c2  NA    2
1    C          c3  NA    4
1    D          d1  NA    4
1    D          d2  NA    6
1    E          e1  NA    2
2    A          a1  NA    5
2    A          a2  NA    3 
2    B          b1  9     3
2    B          b2  NA    2
2    B          b3  NA    3
2    B          b4  NA    5
2    C          c1  NA    3
2    C          c2  NA    2
2    C          c3  NA    4
2    D          d1  NA    4
2    D          d2  NA    6
2    E          e1  NA    2
3    A          a1  14    5
3    A          a2  NA    3 
3    B          b1  NA    3
3    B          b2  NA    2
3    B          b3  NA    3
3    B          b4  NA    5
3    C          c1  8     3
3    C          c2  NA    2
3    C          c3  NA    4
3    D          d1  NA    4
3    D          d2  NA    6
3    E          e1  NA    2
4    A          a1  9     5
4    A          a2  NA    3 
4    B          b1  NA    3
4    B          b2  NA    2
4    B          b3  NA    3
4    B          b4  NA    5
4    C          c1  NA    3
4    C          c2  NA    2
4    C          c3  NA    4
4    D          d1  NA    4
4    D          d2  NA    6
4    E          e1  NA    2
5    A          a1  NA    5
5    A          a2  NA    3 
5    B          b1  13    3
5    B          b2  13    2
5    B          b3  NA    3
5    B          b4  NA    5
5    C          c1  NA    3
5    C          c2  NA    2
5    C          c3  NA    4
5    D          d1  7     4
5    D          d2  NA    6
5    E          e1  8     2
  

Я думал, что мне придется реплицировать df_job по количеству недель в df_week, а затем каким-то образом использовать функцию слияния для выполнения объединения. Но, похоже, это не работает, поскольку элементы в идентификаторе (задание) не уникальны, и как мне представить отсутствующие данные?

Комментарии:

1. почему значения, содержащиеся в заданиях, которые не выполняются в течение определенной недели, должны быть заполнены с помощью NA? На данный момент первые два фрейма данных, похоже, не содержат информации, необходимой для создания третьего. Можете ли вы предоставить воспроизводимый пример?

2. @sjp NAs будет представлять задания, которые не были завершены за эту конкретную неделю. Чего именно не хватает в первых двух фреймах данных?

3.У вас должен быть какой-то способ кодирования того факта, что если задание не выполняется в течение данной недели, его значение равно NA. Если вы merge используете фреймы данных Job такими, какие они есть, вы можете либо иметь такой же набор данных, как df_week но со Days столбцом для строк, которые существуют в df_week или у вас могут быть все задания, но week столбец не будет заполнен правильно, и информация будет дублироваться неправильно.

4. Ну, есть исчерпывающий список заданий, которые необходимо дублировать каждую неделю. Можем ли мы сначала создать исходный фрейм данных с помощью этой репликации, а затем заполнять фрейм данных всякий раз, когда задание выполняется на этой неделе?

5. Моя проблема заключалась только в том, что вам нужно было реплицировать df_jobs для каждой недели и объединять фреймы данных как по заданию, так и по неделе. Ronak прекрасно решил эту проблему.

Ответ №1:

Вы можете реплицировать строки, df_job используя количество уникальных недель в df_week . Создайте Week столбец и присоединитесь к фрейму данных.

 library(dplyr)
n <- n_distinct(df_week$Week)

df_job %>%
  tidyr::uncount(n) %>%
  mutate(Week  = rep(1:n, length.out = n())) %>%
  left_join(df_week, by = c('Job', 'Week'))

#   Job Days Week Department Value
#1   a1    5    1          A    10
#2   a2    3    1          A    12
#3   b1    3    1       <NA>    NA
#4   b2    2    1       <NA>    NA
#5   b3    3    1       <NA>    NA
#6   b4    5    1       <NA>    NA
#7   c1    3    1       <NA>    NA
#8   c2    2    1       <NA>    NA
#9   c3    4    1       <NA>    NA
#10  d1    4    1       <NA>    NA
#11  d2    6    1       <NA>    NA
#12  e1    2    1       <NA>    NA
#13  e2    3    1       <NA>    NA
#14  e3    2    1       <NA>    NA
#15  a1    5    2       <NA>    NA
#16  a2    3    2       <NA>    NA
#17  b1    3    2          B     9
#...
#...