#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
#...
#...