如何仅从最后 5 个整数值中减去中位数
How to subtract a median only from 5 last integer values
我有这个数据集
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 类动作的中值,然后计算 0 类动作的中值,使用一类前的最后五个整数值。我只取最后5个观察值,需要取零类动作的最后5个观察值,但只取整数值,不计算中位数
按零类别的所有值。在我们的例子中是
200
3600
700
1000
2600
然后用一个类别的中位数减去零类别的中位数。
零类动作中的观察次数可以从 0 到 10 不等。如果我们有 10 个零类别的整数值,我们取最后五个。如果只有 1、2、3、4、5 个整数值,我们减去整数值的实数的中位数。如果我们只有 0 而没有 integer ,我们只减去 0.
来自相邻主题 的 Akshay 的这个解决方案帮助了我
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)
但是代码计算零类动作的所有obs的中位数,它必须计算零类的中位数,但是一个类别之前的最后5个obs。
如果有人帮我原创,也就是相邻的话题,我只会删掉这个新话题,不会产生相关话题。
请注意,操作的零类别可能有其他值而不是零。
Edit2 我添加了新类别 - CustomerName
出来
put <- data.frame(mydat[which.max(as.Date(mydat$Dt)),
c("CustomerName","ItemRelation","DocumentNum","DocumentYear")],
value = m,
row.names = 1:length(which.max(as.Date(mydat$Dt))))
CustomerName ItemRelation DocumentNum DocumentYear value
1 orange TC 157214 1529 2018 162
为什么我只得到一个字符串?
输出必须作为示例。有很多stratum.not一个
CustomerName ItemRelation DocumentNum DocumentYear value
1 orange TC 157214 1529 2018 162
2 appleTC 5 1529 2018 164
我不太清楚你到底想完成什么。不过,这可能会有帮助。
您可以使用 which
和 intersect
:
对您需要的部分数据进行子集化
# df with action 0 and stuff > 0
v <- df$stuff[intersect(which(df$action == 0),
which(df$stuff > 0))]
# df with action 1 and stuff > 0
w <- df$stuff[intersect(which(df$action == 1),
which(df$stuff > 0))]
v
包含 stuff
的所有元素,其中 action
是 0
而 stuff
不是 0
。从现在开始,计算中位数是一种形式。 (您可能希望在 intersect(...)
为空的情况下添加安全措施,例如,如果 stuff
始终为 0
而 action
为 0
)。
# calulating the median of v for the last 5 observations
l <- length(v)
m0 <- median(v[(l-4):l]) # taking the median of the last 5 observations
# computing the final difference
m <- median(w) - m0
编辑
要重现上述输出,请考虑
output <- data.frame(df[which.max(as.Date(df$Dt)),
c("Dt","ItemRelation","num","year")],
value = m,
row.names = 1:length(which.max(as.Date(df$Dt))))
其中 which.max(as.Date(df$Dt))
给出了最新日期的行号。但是,您为获得该结果而应用的逻辑可能有所不同,因此建议您在此处谨慎行事。
无论如何,这里是输出
> output
Dt ItemRelation num year value
1 2018-03-30 00:00:00.000 158043 1459 2018 -300
我有这个数据集
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 类动作的中值,然后计算 0 类动作的中值,使用一类前的最后五个整数值。我只取最后5个观察值,需要取零类动作的最后5个观察值,但只取整数值,不计算中位数 按零类别的所有值。在我们的例子中是
200
3600
700
1000
2600
然后用一个类别的中位数减去零类别的中位数。
零类动作中的观察次数可以从 0 到 10 不等。如果我们有 10 个零类别的整数值,我们取最后五个。如果只有 1、2、3、4、5 个整数值,我们减去整数值的实数的中位数。如果我们只有 0 而没有 integer ,我们只减去 0.
来自相邻主题
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)
但是代码计算零类动作的所有obs的中位数,它必须计算零类的中位数,但是一个类别之前的最后5个obs。
如果有人帮我原创,也就是相邻的话题,我只会删掉这个新话题,不会产生相关话题。
请注意,操作的零类别可能有其他值而不是零。
Edit2 我添加了新类别 - CustomerName
出来
put <- data.frame(mydat[which.max(as.Date(mydat$Dt)),
c("CustomerName","ItemRelation","DocumentNum","DocumentYear")],
value = m,
row.names = 1:length(which.max(as.Date(mydat$Dt))))
CustomerName ItemRelation DocumentNum DocumentYear value
1 orange TC 157214 1529 2018 162
为什么我只得到一个字符串? 输出必须作为示例。有很多stratum.not一个
CustomerName ItemRelation DocumentNum DocumentYear value
1 orange TC 157214 1529 2018 162
2 appleTC 5 1529 2018 164
我不太清楚你到底想完成什么。不过,这可能会有帮助。
您可以使用 which
和 intersect
:
# df with action 0 and stuff > 0
v <- df$stuff[intersect(which(df$action == 0),
which(df$stuff > 0))]
# df with action 1 and stuff > 0
w <- df$stuff[intersect(which(df$action == 1),
which(df$stuff > 0))]
v
包含 stuff
的所有元素,其中 action
是 0
而 stuff
不是 0
。从现在开始,计算中位数是一种形式。 (您可能希望在 intersect(...)
为空的情况下添加安全措施,例如,如果 stuff
始终为 0
而 action
为 0
)。
# calulating the median of v for the last 5 observations
l <- length(v)
m0 <- median(v[(l-4):l]) # taking the median of the last 5 observations
# computing the final difference
m <- median(w) - m0
编辑
要重现上述输出,请考虑
output <- data.frame(df[which.max(as.Date(df$Dt)),
c("Dt","ItemRelation","num","year")],
value = m,
row.names = 1:length(which.max(as.Date(df$Dt))))
其中 which.max(as.Date(df$Dt))
给出了最新日期的行号。但是,您为获得该结果而应用的逻辑可能有所不同,因此建议您在此处谨慎行事。
无论如何,这里是输出
> output
Dt ItemRelation num year value
1 2018-03-30 00:00:00.000 158043 1459 2018 -300