r - 通过变量均衡值,考虑到 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 的零类别执行。在一个类别之后,我们不接触零类别。
解决方案
如果我理解正确,总是有一个连续的零条纹,IsPromo
然后是一个连续的1
s 条纹(被 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 标记的行。
推荐阅读
- javascript - JavaScript:如何引用类的顶部/根?
- python - TypeError:不支持的操作数类型
- react-native - 在 React Native 中链接不同的屏幕
- python - 为什么我的点击不能在 pygame 中立即生效?
- javascript - mongodb(节点:37068)UnhandledPromiseRejectionWarning:windows上的nodejs应用程序出错
- python - 用正则表达式匹配不同位置的单词
- ros - 为什么不识别对 URDF 文件的更新?
- python - SQLAlchemy 只连接一列
- r - R函数用阴影绘制不等式
- sublimetext - Sublime Text:在“替换”功能中禁用刷新/替换?