Пример набора данных приведен ниже:
fact_code line_code date style run_rank style_spell
1206 1206029 2017-04-05 283674d 1 1
1206 1206029 2017-04-06 283674d 2 0
... ... ... ... ... ...
1206 1206029 2017-04-18 283674d 7 0
1206 1206046 2017-05-01 283674d 1 1
1206 1206046 2017-05-15 283674d 2 1
... ... ... ... ... ...
1206 1206046 2017-05-21 283674d 7 0
... ... ... ... ... ...
1222 1222003 2017-09-11 65654 1 1
... ... ... ... ... ...
1222 1222003 2017-09-19 65654 8 0
Выход dput()
без ...
:
structure(list(fact_code = c(1206L, 1206L, 1206L, 1206L, 1206L,
1206L, 1222L, 1222L), line_code = c(1206029L, 1206029L, 1206029L,
1206046L, 1206046L, 1206046L, 1222003L, 1222003L), date = c("05/04/2017",
"06/04/2017", "18/04/2017", "01/05/2017", "15/05/2017", "21/05/2017",
"11/09/2017", "19/09/2017"), style = c("283674d", "283674d",
"283674d", "283674d", "283674d", "283674d", "65654", "65654"),
run_rank = c(1L, 2L, 7L, 1L, 2L, 7L, 1L, 8L), style_spell = c(1L,
0L, 0L, 1L, 1L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA,
-8L))
Переменные fact_code
означают код фабрики одежды, line_code
означает код фабричной линии, style
- символьная переменная для стиля одежды, который линия производит в данную дату, а run_rank
обозначает ранжирование дней производства. style_spell
- это переменная индикатора, которая принимает значение 1, чтобы указать начало нового производственного заклинания фабричной линией для определенного стиля одежды, и 0 в противном случае.
Я хотел бы создать новую переменную spell_num
, которая указывает номер текущего заклинания для стиля, который производит фабричная линия. Таким образом, переменная должна выглядеть следующим образом:
fact_code line_code date style run_rank style_spell spell_num
1206 1206029 2017-04-05 283674d 1 1 1
1206 1206029 2017-04-06 283674d 2 0 1
... ... ... ... ... ... ...
1206 1206029 2017-04-18 283674d 7 0 1
1206 1206046 2017-05-01 283674d 1 1 1
1206 1206046 2017-05-15 283674d 2 1 2
... ... ... ... ... ... ...
1206 1206046 2017-05-21 283674d 7 0 2
... ... ... ... ... ... ...
1222 1222003 2017-09-11 65654 1 1 1
... ... ... ... ... ... ...
1222 1222003 2017-09-19 65654 8 0 1
structure(list(fact_code = c(1206L, 1206L, 1206L, 1206L, 1206L,
1206L, 1222L, 1222L), line_code = c(1206029L, 1206029L, 1206029L,
1206046L, 1206046L, 1206046L, 1222003L, 1222003L), date = c("05/04/2017",
"06/04/2017", "18/04/2017", "01/05/2017", "15/05/2017", "21/05/2017",
"11/09/2017", "19/09/2017"), style = c("283674d", "283674d",
"283674d", "283674d", "283674d", "283674d", "65654", "65654"),
run_rank = c(1L, 2L, 7L, 1L, 2L, 7L, 1L, 8L), style_spell = c(1L,
0L, 0L, 1L, 1L, 0L, 1L, 0L), spell_num = c(1L, 1L, 1L, 1L,
2L, 2L, 1L, 1L)), class = "data.frame", row.names = c(NA,
-8L))
Переменная spell_num
для данной фабричной линии (line_code
), создающей данный стиль (style
), принимает значение 1, когдав первый день производства и, следовательно, начала нового заклинания (т.е. run_rank
= 1), значение переменной индикатора style_spell
равно 1. Например, в первой строке строка 1206029 сначала начинает производитьстиль 283674d на 2017-04-05 и, следовательно, style_spell
и spell_num
равны 1.
Со следующей последующей даты / производственного дня (т.е. run_rank
> = 2) значениепеременной style_spell
изменяется на 0.
Однако spell_num
принимает значение 1 для данной линии и стиля, пока style_spell
не изменится на 1 снова. Это может произойти двумя способами. Во-первых, если у нас есть новая фабричная линия, производящая тот же стиль (например, когда линия 1206046 начинает производить стиль 283674d 2017-04-18 после того, как линия 1206029 заканчивает свое производство на 7-й день).
Или когда одна и та же линия воспроизводит стиль после двухнедельного перерыва. Например, линия 1206046 имеет два заклинания;первое заклинание происходит там, где style_spell
= 1, что в первый день производства для стиля 283674d, то есть 2017-05-01, следовательно, соответствует run_rank
= 1. В начале второго заклинания для линии 1206046 на2017-05-15, значение spell_num
изменяется на 2 с 1, чтобы указать, что две недели истекли, и что теперь линия находится во втором заклинании, производящем этот конкретный стиль.
Переменная spell_num
теперь будет принимать это значение 2, если в производстве этого стиля нет прерывания или перерыва в две недели, или когда новая линия начинает производить тот же или другой новый стиль.
Я пытался сгенерировать эту предполагаемую переменную, используя следующий код:
dplyr::filter(style_spell == 1) %>%
dplyr::select(fact_code, line_code, date, style, run_rank, Diff, Diff_max, style_multi, style_spell)
dplyr::group_by(line_code, date, style, run_rank) %>%
dplyr::mutate(style_spell_num = row_number())
Код можно разбить на два этапа, где на первом этапе я пытаюсьсоздать подмножество данных, где style_spell
= 1. После работы с подмножеством я планировал объединить переменную, созданную в этом подмножестве, с основными данными, df.
Однако я не получаю ожидаемого результата. И, кроме того, в идеале мне нужен код, который может создать переменную spell_num
за один шаг, т.е. использовать основные данные df
, а не работать с ее подмножеством.
Любая помощь будет оценена.