首页 > 解决方案 > 通过变量均衡值,考虑到 R 中的类别和组

问题描述

在我的数据中

#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

有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 的值并用它替换这一行中的输出值。

2          11202           2         514       0  **2**

对于第二行 returncount =2 ,所以 0 由输出替换为它。请注意,此操作仅对 0ne 类别之前的 ispromo 的零类别执行。在一个类别之后,我们不接触零类别。

标签: rdplyrdata.tablelapply

解决方案


如果我理解正确,总是有一个连续的零条纹,IsPromo然后是一个连续的1s 条纹(被 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 标记的行。


推荐阅读