在我的数据中
#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))
我有分组vars
ItemRelation DocumentNum
11202 514
11202 96
有Ispromo列。它只能接受0和1。 所以ReturnCount是数字变量。
我需要用returncount which go before 1 category of ispromo
的值替换输出列的值。
这意味着,对于ispromo的零类别而言,其值要高于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
**在ispromo的一类之前用ispromo的零类标记输出的值。即我们在这一行中获取returncount的值,并替换为该行中output的值。
2 11202 2 514 0 **2**
对于第二行returncount = 2,所以输出替换为0。 请注意,此操作仅对0ne类别之前的ispromo零类别执行。一类之后,我们不会碰零类。
答案 0 :(得分:1)
如果我理解正确,IsPromo
中总是存在零的连续条纹,然后是连续的1
(由OP称为一个类别)的连续条纹,并在每个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在预期结果中标记的行相对应。