如何仅从整数值中减去中值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何仅从整数值中减去中值相关的知识,希望对你有一定的参考价值。
我有这个数据集
df=structure(list(Dt = structure(1:39, .Label = c("2018-02-20 00:00:00.000",
"2018-02-21 00:00:00.000", "2018-02-22 00:00:00.000", "2018-02-23 00:00:00.000",
"2018-02-24 00:00:00.000", "2018-02-25 00:00:00.000", "2018-02-26 00:00:00.000",
"2018-02-27 00:00:00.000", "2018-02-28 00:00:00.000", "2018-03-01 00:00:00.000",
"2018-03-02 00:00:00.000", "2018-03-03 00:00:00.000", "2018-03-04 00:00:00.000",
"2018-03-05 00:00:00.000", "2018-03-06 00:00:00.000", "2018-03-07 00:00:00.000",
"2018-03-08 00:00:00.000", "2018-03-09 00:00:00.000", "2018-03-10 00:00:00.000",
"2018-03-11 00:00:00.000", "2018-03-12 00:00:00.000", "2018-03-13 00:00:00.000",
"2018-03-14 00:00:00.000", "2018-03-15 00:00:00.000", "2018-03-16 00:00:00.000",
"2018-03-17 00:00:00.000", "2018-03-18 00:00:00.000", "2018-03-19 00:00:00.000",
"2018-03-20 00:00:00.000", "2018-03-21 00:00:00.000", "2018-03-22 00:00:00.000",
"2018-03-23 00:00:00.000", "2018-03-24 00:00:00.000", "2018-03-25 00:00:00.000",
"2018-03-26 00:00:00.000", "2018-03-27 00:00:00.000", "2018-03-28 00:00:00.000",
"2018-03-29 00:00:00.000", "2018-03-30 00:00:00.000"), class = "factor"),
ItemRelation = c(158043L, 158043L, 158043L, 158043L, 158043L,
158043L, 158043L, 158043L, 158043L, 158043L, 158043L, 158043L,
158043L, 158043L, 158043L, 158043L, 158043L, 158043L, 158043L,
158043L, 158043L, 158043L, 158043L, 158043L, 158043L, 158043L,
158043L, 158043L, 158043L, 158043L, 158043L, 158043L, 158043L,
158043L, 158043L, 158043L, 158043L, 158043L, 158043L), stuff = c(200L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3600L, 0L, 0L, 0L, 0L,
700L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1000L,
2600L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 700L), num = c(1459L,
1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L,
1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L,
1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L,
1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L, 1459L,
1459L, 1459L), year = 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), action = 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, 1L, 1L)), .Names = c("Dt", "ItemRelation",
"stuff", "num", "year", "action"), class = "data.frame", row.names = c(NA,
-39L))
动作列只有两个值0和1.我必须通过1个动作类别的东西计算中位数,然后使用零动作类别的东西计算中位数,使用一个类别之前的最后五个整数值。我只取最后5个观察结果,有必要在零行动类别中取最后5个观察值,但在我们的例子中只有整数值这是
200
3600
700
1000
2600
然后从一个类别的中位数中减去零类别的中位数。
零作业类别中的东西观察数量可以在0-10之间变化。如果我们有10个零类别的整数值,我们采用最后五个。如果只有1,2,3,4,5个整数值,我们减去实数整数值的中位数。如果我们只有0而没有整数,那么我们只需要取0。
怎么做?
edit expected output
Dt ItemRelation DocumentNum DocumentYear value
2018-03-30 00:00:00.000 158043 1459 2018 -300
*-300=(700-median( 200,
3600,
700,
1000,
2600)
note, if for 1 category of action by stuff there is one value(in our case it is 700) we don't calculate median, we work only with this value
如果有两个值,我们按东西计算1个类别的中位数
答案
df.0 <- df %>% filter(action == 0 & stuff != 0) %>% arrange(Dt) %>% top_n(5)
df.1 <- df %>% filter(action==1 & stuff!=0)
new.df <- rbind(df.0,df.1)
View(
df %>% select (everything()) %>% group_by(ItemRelation, num, year) %>%
summarise(
median.1 = median(stuff[action == 1 & stuff != 0], na.rm = T),
median.0 = median(stuff[action == 0 &
stuff != 0], na.rm = T)
) %>%
mutate(
value = median.1 - median.0,
DocumentNum = num,
DocumentYear = year
) %>%
select(ItemRelation, DocumentNum, DocumentYear, value)
这有帮助吗?
以上是关于如何仅从整数值中减去中值的主要内容,如果未能解决你的问题,请参考以下文章