基于R中变量及其值的不同组合生成唯一的拼写编号

基于R中变量及其值的不同组合生成唯一的拼写编号,r,dplyr,R,Dplyr,下面提供了一个示例数据集: 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 ... ... ... ... ...

下面提供了一个示例数据集:

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输出不带。。。是:

变量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 
对于产生给定样式的给定工厂生产线生产线代码,在第一个生产日,其变量spell_num的值为1,因此,新拼写开始时,即run_rank=1,指示变量style_spell的值为1。例如,在第一行中,第1206029行首先在2017-04-05开始生成样式283674d,因此,style_spell和spell_num都等于1

从下一个后续日期/生产日开始,即运行等级>=2,变量样式拼写的值更改为0

但是,对于给定的线条和样式,拼写值假定为1,直到样式拼写再次变为1为止。这可以通过两种方式实现。首先,如果我们有一条生产相同款式的新工厂生产线,例如1206046生产线在2017-04-18开始生产283674d款式,而1206029生产线在第7天结束生产

或者当同一行在中断两周后重新生成样式时。例如,第1206046行有两个咒语;第一次拼写发生在283674d样式的第一个生产日,即2017-05-01,样式拼写=1,因此对应于运行等级=1。2017年5月15日,第1206046行的第二个咒语开始时,咒语_num的值从1变为2,表示两周过去了,该行现在处于第二个咒语中,产生了该特定样式

变量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)
代码可以分为两个阶段,在第一阶段中,我尝试创建一个style_spell=1的数据子集。在对子集进行操作之后,我的计划是将在该子集上创建的变量合并到主数据df中


然而,我没有得到预期的结果。此外,我希望有一个代码可以在一步中创建变量,即使用主数据df,而不是对其子集进行操作

任何帮助都将不胜感激

谢谢您的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

我不是百分之百确定这种风格应该在小组里。从您的描述中我真的看不出来,对于小样本数据来说,这没有什么区别。

但是,我没有得到预期的结果。您能否更具体地说明结果与您的意图之间的差异?此外,您能否以更好的格式提供示例数据?所有的。。。让输入变得烦人。也许与dput共享一些可复制/粘贴的数据以补充表格,其中。。。将意义传达给人类,但不传达给R。我得到的拼写_num的值是所有行的1。相反,它应该假设第二个数据帧中列出的值。另外,我已经从R复制并粘贴了dput。请注意,我已经排除了…我已经尝试了您的代码,并且工作得非常优雅!这正是我想要的。
  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())
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