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

  • 本文关键字:组合 唯一 编号 变量 根据 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
...       ...       ...          ...          ...         ...
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))

对于生产给定样式(style(的给定工厂生产线(line_code(,变量spell_num在第一个生产日取值1,因此,在新拼写(即run_rank=1(开始时,指示符变量style_spell的值为1。例如,在第一行中,行1206029首先在2017-04-05开始生成样式283674d,因此style_spellspell_num都等于1。

从下一个日期/生产日起(即run_rank>=2(,变量style_spell的值变为0。

然而,对于给定的行和样式,spell_num假定值为1,直到style_spell再次变为1。这可能通过两种方式发生。首先,如果我们有一条新的生产线生产相同的款式(例如,1206029线在第7天结束生产后,1206046线于2017-04-18开始生产283674d款式(。

或者当同一条线在两周的中断后重新产生风格时。例如,第1206046行有两个咒语;第一个咒语发生在style_spell=1的情况下,这是样式283674d的第一个生产日,即2017-05-01,因此对应于run_rank=1。在2017-05-15第1206046行的第二个咒语开始时,spell_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)
dplyr::group_by(line_code, date, style, run_rank) %>%
dplyr::mutate(style_spell_num = row_number())

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

然而,我并没有得到预期的结果。此外,理想情况下,我希望有一个代码可以在一步中创建变量spell_num,即使用主数据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

我不能100%确定style应该在group_by中。我真的无法从你的描述中分辨出来,对于小样本的数据来说,这也没有什么区别。

最新更新