Генерация уникального номера заклинания на основе различных комбинаций переменных и их значений в R - PullRequest
0 голосов
/ 25 октября 2019

Пример набора данных приведен ниже:

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, а не работать с ее подмножеством.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 25 октября 2019

Спасибо за dput --- делает это намного проще.

Насколько я могу сказать, это то, что вы хотите:

df %>% 
  group_by(fact_code, line_code, style) %>%
  mutate(my_answer = cumsum(style_spell))
# # A tibble: 8 x 8
# # Groups:   fact_code, line_code, style [3]
#   fact_code line_code date       style   run_rank style_spell spell_num my_answer
#       <int>     <int> <chr>      <chr>      <int>       <int>     <int>     <int>
# 1      1206   1206029 05/04/2017 283674d        1           1         1         1
# 2      1206   1206029 06/04/2017 283674d        2           0         1         1
# 3      1206   1206029 18/04/2017 283674d        7           0         1         1
# 4      1206   1206046 01/05/2017 283674d        1           1         1         1
# 5      1206   1206046 15/05/2017 283674d        2           1         2         2
# 6      1206   1206046 21/05/2017 283674d        7           0         2         2
# 7      1222   1222003 11/09/2017 65654          1           1         1         1
# 8      1222   1222003 19/09/2017 65654          8           0         1         1

Я не на 100%убедитесь, что style должно быть в group_by. Я не могу точно сказать из вашего описания, и для небольшой выборки данных это не имеет значения.

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