【发布时间】:2018-08-18 12:08:33
【问题描述】:
我有数据集
mydat=structure(list(code = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = "52382МСК", class = "factor"), item = c(11709L,
11709L, 11709L, 11709L, 1170L, 1170L, 1170L, 1170L), sales = c(30L,
10L, 20L, 15L, 8L, 10L, 2L, 15L), action = c(0L, 1L, 0L, 0L,
0L, 1L, 0L, 0L)), .Names = c("code", "item", "sales", "action"
), class = "data.frame", row.names = c(NA, -8L))
按代码和项目分为两组
code item
52382МСК 11709
52382МСК 1170
我还有行动专栏。它只能有两个值零(0)或一(1)。我需要按动作列通过 1 个前面的零类别计算中位数,即在一类动作列之前,并通过在一个类别之后的动作列计算 2 个零。 如果中位数大于销售额,则不要替换它。
如果我按动作列有三个前面的零类别,即在一个动作列类别之前,并且在一个类别之后的动作列有三个零,则此解决方案很好。 但是,如果我按动作列有 1 个前面的零类别,即在一个类别的动作列之前,并且在一个类别之后的动作列有 2 个零。它不正确
replacements <-
data_frame(
action1 = which(mydat$action == 1L),
group = rep(1:length(action1), each = 2, length.out = length(action1)),
sales1 = mydat$sales[action1],
sales_before = mydat$sales[action1 -1L],
sales_after = mydat$sales[action1 +2L]
) %>%
group_by(group) %>%
mutate(
med = median(c(sales_before, sales_after)),
output = pmin(sales1, med)
)
mydat$output <- mydat$sales
mydat$output[replacements$action1] <- replacements$output
我得到输出
code item sales action output
1 52382МСК 11709 30 0 30
2 52382МСК 11709 10 1 10
3 52382МСК 11709 20 0 20
4 52382МСК 11709 15 0 15
5 52382МСК 1170 8 0 8
6 52382МСК 1170 10 1 10
7 52382МСК 1170 2 0 2
8 52382МСК 1170 15 0 15
但输出应该是
code item sales action output
1 52382МСК 11709 30 0 30
2 52382МСК 11709 10 1 10
3 52382МСК 11709 20 0 20
4 52382МСК 11709 15 0 15
5 52382МСК 1170 8 0 8
6 52382МСК 1170 10 1 **8**
7 52382МСК 1170 2 0 2
8 52382МСК 1170 15 0 15
我怎样才能得到正确的输出?
编辑
code item sales action
1 a b 2 0
2 a b 4 0
3 a b 3 0
4 a b 10 1
5 a b 4 1
6 a b 10 0
7 a b 6 0
8 a b 6 0
9 c d 2 0
10 c d 4 0
11 c d 3 0
12 c d 10 1
13 c d 10 0
14 c d 6 0
15 c d 6 0
【问题讨论】:
-
我不明白你的问题。你能澄清一下逻辑吗?
-
@Charlicito,这个逻辑来自我的帖子。 stackoverflow.com/questions/51876158/…。在那篇文章中,我必须计算一个类别之前的三个零动作类别的中位数,以及一个类别动作之后的三个零。现在需要在一个类别之前通过1个零类别的动作和一个类别之后的两个零来计算中位数。
-
你说的“三零类动作前归一类”是什么意思
-
@Charlicito,我编辑了帖子。正如您所看到的,A+B 组按操作列三个零类别,然后是 1 个类别,然后是三个零类别。
标签: r dplyr data.table plyr