Как вычесть медиану только из 5 последних целых значений

78
11

У меня есть этот набор данных

    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.

это решение 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)

Но код вычисляет медиану по общему нулевому типу действия, он должен вычислять медианную нулевую категорию, но 5 последних очей перед одной категорией.

Если кто-нибудь поможет мне в оригинальной, то есть смежной теме, я просто удалю эту новую тему, а не создаю связанные темы.

Обратите внимание, что вместо нулей могут быть другие значения для нулевой категории действия. Edit2 я добавил новое имя category- 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

почему я получаю только одну строку? выход должен быть примером. есть много страт.не одного

CustomerName ItemRelation DocumentNum DocumentYear value
1 orange TC 157214 1529 2018 162
2 appleTC 5 1529 2018 164

спросил(а) 2021-01-25T09:15:18+03:00 4 месяца, 4 недели назад
1
Решение
63

Мне не совсем понятно, что именно вы хотите выполнить. Однако это может помочь.

Вы можете подмножить часть данных, которые вам нужны, и 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

ответил(а) 2021-01-25T09:15:18+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема