выровнять значения по переменным с учетом категории и групп в R - PullRequest
0 голосов
/ 09 сентября 2018

По моим данным

#EDIT DPUT 
mydat=structure(list(ItemRelation = c(11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 11202L, 
11202L, 11202L, 11202L, 11202L), ReturnCount = c(0L, 2L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 
0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L), DocumentNum = c(514L, 514L, 514L, 514L, 
514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 
514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 
514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 
514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 514L, 
514L, 514L, 514L, 514L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 
896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 
896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 
896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 
896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 896L, 
896L), IsPromo = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), CalendarYear = c(2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L), output = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, NA, NA, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, NA, NA, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L)), .Names = c("ItemRelation", "ReturnCount", "DocumentNum", 
"IsPromo", "CalendarYear", "output"), class = "data.frame", row.names = c(NA, 
-104L))

У меня есть групповые переменные

ItemRelation    DocumentNum
11202                 514
11202                  96

Есть колонка Испромо. Может принимать значения только 0 и 1. Таким образом, ReturnCount является числовой переменной.

Мне нужно заменить значения выходного столбца на значения returncount which go before 1 category of ispromo. Это означает, что значения по нулевой категории испромо, которые идут перед одной категорией испромо, для столбцов returncount и output должны быть одинаковыми. НО, значения этих столбцов for zero category of ispromo AFTER one category мы не трогаем. Как это сделать для каждой группы ItemRelation + DocumentNum?

Привести к желаемому выводу

Изменить ожидаемый результат

    ItemRelation ReturnCount DocumentNum IsPromo output
1          11202           0         514       0      0
2          11202           2         514       0  **2**
3          11202           0         514       0      0
4          11202           0         514       0      0
5          11202           0         514       0      0
6          11202           0         514       0      0
7          11202           0         514       0      0
8          11202           0         514       0      0
9          11202           0         514       0      0
10         11202           0         514       0      0
11         11202           1         514       0  **1**
12         11202           0         514       0      0
13         11202           1         514       0  **1**
14         11202           1         514       0  **1**
15         11202           0         514       0      0
16         11202           0         514       0      0
17         11202           0         514       0      0
18         11202           0         514       0      0
19         11202           0         514       0      0
20         11202           0         514       0      0
21         11202           0         514       0      0
22         11202           0         514       0      0
23         11202           0         514       0      0
24         11202           0         514       0      0
25         11202           0         514       0      0
26         11202           0         514       0      0
27         11202           0         514       0      0
28         11202           1         514       0  **1**
29         11202           0         514       0      0
30         11202           0         514       0      0
31         11202           0         514       0      0
32         11202           0         514       0      0
33         11202           0         514       0      0
34         11202           0         514       0      0
35         11202           0         514       0      0
36         11202           0         514       1   <NA>
37         11202           0         514       1   <NA>
38         11202           0         514       0      0
39         11202           0         514       0      0
40         11202           0         514       0      0
41         11202           3         514       0      0
42         11202           0         514       0      0
43         11202           0         514       0      0
44         11202           0         514       0      0
45         11202           0         514       0      0
46         11202           1         514       0      1
47         11202           1         514       0      1
48         11202           0         514       0      0
49         11202           0         514       0      0
50         11202           0         514       0      0
51         11202           0         514       0      0
52         11202           0         514       0      0
53         11202           1         896       0  **1**
54         11202           0         896       0      0
55         11202           0         896       0      0
56         11202           0         896       0      0
57         11202           0         896       0      0
58         11202           0         896       0      0
59         11202           0         896       0      0
60         11202           0         896       0      0
61         11202           0         896       0      0
62         11202           0         896       0      0
63         11202           0         896       0      0
64         11202           0         896       0      0
65         11202           0         896       0      0
66         11202           0         896       0      0
67         11202           1         896       0  **1**
68         11202           0         896       0      0
69         11202           0         896       0      0
70         11202           0         896       0      0
71         11202           0         896       0      0
72         11202           0         896       0      0
73         11202           0         896       0      0
74         11202           0         896       0      0
75         11202           0         896       0      0
76         11202           0         896       0      0
77         11202           0         896       0      0
78         11202           0         896       0      0
79         11202           0         896       0      0
80         11202           3         896       0  **3**
81         11202           0         896       0      0
82         11202           0         896       0      0
83         11202           0         896       0      0
84         11202           0         896       0      0
85         11202           1         896       0  **1**
86         11202           1         896       0  **1**
87         11202           0         896       0      0
88         11202           0         896       1   <NA>
89         11202           0         896       1   <NA>
90         11202           0         896       0      0
91         11202           0         896       0      0
92         11202           0         896       0      0
93         11202           0         896       0      0
94         11202           0         896       0      0
95         11202           0         896       0      0
96         11202           0         896       0      0
97         11202           0         896       0      0
98         11202           0         896       0      0
99         11202           0         896       0      0
100        11202           0         896       0      0
101        11202           0         896       0      0
102        11202           0         896       0      0
103        11202           0         896       0      0
104        11202           0         896       0      0

** помечается значениями выпуска по нулевой категории испромо перед одной категорией испромо. То есть мы берем значение returncount в этой строке и заменяем его значением вывода в этой строке.

2          11202           2         514       0  **2**

для второй строки returncount = 2, поэтому 0 на выходе заменяется на него. Обратите внимание, что эта операция выполняется только для нулевой категории испромо до 0 новой категории. После одной категории мы не касаемся нулевой категории.

1 Ответ

0 голосов
/ 10 сентября 2018

Если я правильно понимаю, всегда есть непрерывная полоса нулей в IsPromo, за которой следует непрерывная полоса 1 с (называемая ОП одна категория ) и завершенная смежной полоса нулей в каждой группе ItemRelation, DocumentNum.

Тогда это можно решить с помощью функции rleid() и update by reference:

library(data.table)
# clean sample dataset: remove output column 
setDT(mydat)[, output := NULL]
# add grouping variable for ISPromo categories
setDT(mydat)[, promo.cat := rleid(IsPromo), by = .(ItemRelation, DocumentNum)][
  # copy only first category in each group
  promo.cat == 1L & IsPromo == 0L, output := ReturnCount][
    # remove helper column
    , promo.cat := NULL][]
mydat
     ItemRelation ReturnCount DocumentNum IsPromo CalendarYear output
  1:        11202           0         514       0         2018      0
  2:        11202           2         514       0         2018      2
  3:        11202           0         514       0         2018      0
  4:        11202           0         514       0         2018      0
  5:        11202           0         514       0         2018      0
 ---                                                                 
100:        11202           0         896       0         2018     NA
101:        11202           0         896       0         2018     NA
102:        11202           0         896       0         2018     NA
103:        11202           0         896       0         2018     NA
104:        11202           0         896       0         2018     NA
# check 
mydat[ReturnCount > 0 & ReturnCount == output]
    ItemRelation ReturnCount DocumentNum IsPromo CalendarYear output
 1:        11202           2         514       0         2018      2
 2:        11202           1         514       0         2018      1
 3:        11202           1         514       0         2018      1
 4:        11202           1         514       0         2018      1
 5:        11202           1         514       0         2018      1
 6:        11202           1         896       0         2018      1
 7:        11202           1         896       0         2018      1
 8:        11202           3         896       0         2018      3
 9:        11202           1         896       0         2018      1
10:        11202           1         896       0         2018      1

Эти строки соответствуют отмеченным OP в ожидаемом результате.

...