【发布时间】:2018-08-16 11:38:23
【问题描述】:
说,我有数据集
mydat=structure(list(code = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L), .Label = "25481МСК", class = "factor"),
item = c(13163L, 13163L, 13163L, 13163L, 13163L, 13163L,
13163L, 13163L, 13163L, 13163L, 13163L, 13163L, 13163L, 13163L,
13163L, 13163L, 13163L, 13163L, 13163L, 13163L, 13163L, 13163L,
13164L, 13164L, 13164L, 13164L, 13164L, 13164L, 13164L, 13164L,
13164L, 13164L, 13164L, 13164L, 13164L, 13164L, 13164L, 13164L,
13164L, 13164L, 13164L, 13164L, 13164L, 13164L), sales = c(4L,
1L, 10L, 6L, 8L, 3L, 11L, 6L, 4L, 2L, 4L, 2L, 4L, 3L, 10L,
4L, 15L, 10L, 6L, 6L, 5L, 4L, 4L, 1L, 10L, 6L, 8L, 3L, 11L,
6L, 4L, 2L, 4L, 2L, 4L, 3L, 10L, 4L, 15L, 10L, 6L, 6L, 5L,
4L), action = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L,
0L, 0L, 0L)), .Names = c("code", "item", "sales", "action"
), class = "data.frame", row.names = c(NA, -44L))
我有 2 组 vars code+item。这里有两组:
25481МСК 13163
25480МСК 13164
我还有行动专栏。它只能有两个值零(0)或一(1)。 我需要按动作列计算前三个零类别的中位数,即在一个类别之前的动作列,以及在一个类别之后的动作列的三个零。
这里是例子
sales action output
2 0 2
4 0 4
3 0 3
10 1 **5**
4 1 **5**
15 1 **5**
10 0 10
6 0 6
6 0 6
中位数=(2,4,3),(10,6,6)=5
所以在一个之前和之后一个零类别的中位数=5, 然后用这个中位数替换ones(1)。即这些零内的一个类别。因为,从例子中可以看出,零内还有其他的。必须对它们应用相同的原则。 但是,如果中位数大于销售额,则不要替换它。
I.E.假设
sales action
10 1
5 1
14 1
零的中位数是 12,所以在这种情况下输出将是
output
10
5
12
只有 14 个必须被替换,因为它比中位数多。
实际情况
sales action output
2 0 2
4 0 4
3 0 3
10 1 **5**
4 1 **4**
15 1 **5**
10 0 10
6 0 6
6 0 6
应该对每个组分别进行。
25481МСК 13163
25480МСК 13164
想要的输出
code item sales action output
1 25481МСК 13163 4 0 4
2 25481МСК 13163 1 0 1
3 25481МСК 13163 10 0 10
4 25481МСК 13163 6 0 6
5 25481МСК 13163 8 0 8
6 25481МСК 13163 3 0 3
7 25481МСК 13163 11 0 11
8 25481МСК 13163 6 0 6
9 25481МСК 13163 4 0 4
10 25481МСК 13163 2 0 2
11 25481МСК 13163 4 0 4
12 25481МСК 13163 2 0 2
13 25481МСК 13163 4 0 4
14 25481МСК 13163 3 0 3
15 25481МСК 13163 10 1 5
16 25481МСК 13163 4 1 5
17 25481МСК 13163 15 1 5
18 25481МСК 13163 10 0 10
19 25481МСК 13163 6 0 6
20 25481МСК 13163 6 0 6
21 25481МСК 13163 5 0 5
22 25481МСК 13163 4 0 4
23 25481МСК 13164 4 0 4
24 25481МСК 13164 1 0 1
25 25481МСК 13164 10 0 10
26 25481МСК 13164 6 0 6
27 25481МСК 13164 8 0 8
28 25481МСК 13164 3 0 3
29 25481МСК 13164 11 0 11
30 25481МСК 13164 6 0 6
31 25481МСК 13164 4 0 4
32 25481МСК 13164 2 0 2
33 25481МСК 13164 4 0 4
34 25481МСК 13164 2 0 2
35 25481МСК 13164 4 0 4
36 25481МСК 13164 3 0 3
37 25481МСК 13164 10 1 5
38 25481МСК 13164 4 1 5
39 25481МСК 13164 15 1 5
40 25481МСК 13164 10 0 10
41 25481МСК 13164 6 0 6
42 25481МСК 13164 6 0 6
43 25481МСК 13164 5 0 5
44 25481МСК 13164 4 0 4
请注意,action=0 的销售列的值也应该在输出列中。如何执行?
附:请不要注意此输出中的中位数大于销售额。这只是测试。
为埃里克
code item sales action output
52382МСК 11709 1 0 1
52382МСК 11709 10 1 NA
52382МСК 11709 1 0 1
52382МСК 11709 3 0 3
【问题讨论】:
标签: r dplyr data.table plyr