Рассчитать медиану для группы на основе значений отставания и отведения в R - PullRequest
0 голосов
/ 08 июня 2018

У меня сложный вопрос, поэтому буду признателен за ваше терпение.

Для каждой точки данных я хотел бы сначала получить значения из столбцов запаздывания и опережения, а затем определить эти значения в серии для моего набора данных.и вычислите медианное значение, используя захваченные значения для каждой группы.

enter image description here

Group,Date,Month,Sales,lag,lead
Group1,42005,1,2503,0,2
Group1,42036,2,3734,0,2
Group1,42064,3,6631,2,3
Group1,42095,4,8606,0,0
Group1,42125,5,1889,0,2
Group1,42156,6,4819,1,2
Group1,42186,7,3294,1,0
Group1,42217,8,38999,2,0
Group1,42248,9,28372,1,0
Group1,42278,10,25396,4,1
Group1,42309,11,21093,1,0
Group2,42339,1,9263,0,3
Group2,42005,2,6660,1,3
Group2,42036,3,28595,2,2
Group2,42064,4,123,2,0
Group2,42095,5,11855,3,3
Group2,42125,6,15845,4,3
Group2,42156,7,32331,2,2
Group2,42186,8,3188,1,1
Group2,42217,9,38161,4,0

Например, если мы посмотрим на 6-й месяц для группы 1,значение Sales - 4819, значение задержки и опережения - 1 и 2 соответственно.Я хотел бы сначала захватить значения отставания и опережения, а затем vlookup в серии.Для 4819, для лага (значение = 1), я хотел бы перейти к одному пункту данных выше 4819 (что составляет 1889, aka 4819-> 1889, аналогично для свинца (значение = 2), я хотел бы перейти к двум точкам данныхниже 4891, то есть 3294 и 38999. Итак, теперь точки захвата для 4819 точек данных - это 1899, 4819, 3294 и 38999, поэтому теперь я хотел бы взять медиану этого и сохранить ее в своем выводе. Это упражнение, которое я хочу выполнитьсделать для каждой группы.

Точно так же, для Группы 2, Месяц 4, я хотел бы взять данные о предыдущих двух точках задержки со ссылкой на 123 (опережение равно нулю, следовательно, оно не будет захвачено), и взять медиануиз всех 3 значений.

Я попробовал то же самое для одного конкретного случая с условием ifelse, чтобы посмотреть, как оно работает.

df $ output <- ifelse (lag == 0 & lead == 1, медиана (Sales, lead (Sales, 1)), 0) </strong>

Результат был очень удивительным. R взяла медиану всех значений для столбца. Другойпроблема в том, что даже если бы это сработало, мне пришлось бы написать несколько условий ifelseследовательно, ищу более простое решение.

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

Ниже приведен результат, которого я пытаюсь достичь.

Group,Date,Month,Sales,lag,lead,Output
Group1,42005,1,2503,0,2,3734
Group1,42036,2,3734,0,2,6631
Group1,42064,3,6631,2,3,4276.5
Group1,42095,4,8606,0,0,8606
Group1,42125,5,1889,0,2,3294
Group1,42156,6,4819,1,2,4056.5
Group1,42186,7,3294,1,0,4056.5
Group1,42217,8,38999,2,0,4819
Group1,42248,9,28372,1,0,33685.5
Group1,42278,10,25396,4,1,23244.5
Group1,42309,11,21093,1,0,23244.5
Group2,42339,1,9263,0,3,7961.5
Group2,42005,2,6660,1,3,9263
Group2,42036,3,28595,2,2,9263
Group2,42064,4,123,2,0,6660
Group2,42095,5,11855,3,3,11855
Group2,42125,6,15845,4,3,13850
Group2,42156,7,32331,2,2,15845
Group2,42186,8,3188,1,1,32331
Group2,42217,9,38161,4,0,15845

Любые выводы будут высоко оценены.

Я что-то упустил.пожалуйста, покажите мне, как решить эту проблему.Если есть какая-то функция, которую мне нужно использовать, пожалуйста, помогите мне с ней.

Спасибо,

Ответы [ 2 ]

0 голосов
/ 09 июня 2018
setDT(df)[,i:=sequence(.N)][,med:=as.numeric(median(df$Sales[c((i-lag):(i+lead))])),by=i][,i:=NULL][]
     Group  Date Month Sales lag lead     med
 1: Group1 42005     1  2503   0    2  3734.0
 2: Group1 42036     2  3734   0    2  6631.0
 3: Group1 42064     3  6631   2    3  4276.5
 4: Group1 42095     4  8606   0    0  8606.0
 5: Group1 42125     5  1889   0    2  3294.0
 6: Group1 42156     6  4819   1    2  4056.5
 7: Group1 42186     7  3294   1    0  4056.5
 8: Group1 42217     8 38999   2    0  4819.0
 9: Group1 42248     9 28372   1    0 33685.5
10: Group1 42278    10 25396   4    1 23244.5
11: Group1 42309    11 21093   1    0 23244.5
12: Group2 42339     1  9263   0    3  7961.5
13: Group2 42005     2  6660   1    3  9263.0
14: Group2 42036     3 28595   2    2  9263.0
15: Group2 42064     4   123   2    0  6660.0
16: Group2 42095     5 11855   3    3 11855.0
17: Group2 42125     6 15845   4    3 13850.0
18: Group2 42156     7 32331   2    2 15845.0
19: Group2 42186     8  3188   1    1 32331.0
20: Group2 42217     9 38161   4    0 15845.0
0 голосов
/ 08 июня 2018
df$Output <- sapply(seq(nrow(df)), # For each row (number) in df
                    function(i) 
                      # take the median of Sales from
                      # current row - current lag value
                      # to
                      # current row + current lead value
                      with(df, median(Sales[(i - lag[i]):(i + lead[i])]))) 

Используемые данные:

df <- data.table::fread("
Group,Date,Month,Sales,lag,lead
Group1,42005,1,2503,0,2
Group1,42036,2,3734,0,2
Group1,42064,3,6631,2,3
Group1,42095,4,8606,0,0
Group1,42125,5,1889,0,2
Group1,42156,6,4819,1,2
Group1,42186,7,3294,1,0
Group1,42217,8,38999,2,0
Group1,42248,9,28372,1,0
Group1,42278,10,25396,4,1
Group1,42309,11,21093,1,0
Group2,42339,1,9263,0,3
Group2,42005,2,6660,1,3
Group2,42036,3,28595,2,2
Group2,42064,4,123,2,0
Group2,42095,5,11855,3,3
Group2,42125,6,15845,4,3
Group2,42156,7,32331,2,2
Group2,42186,8,3188,1,1
Group2,42217,9,38161,4,0
")


dout <- fread("
Group,Date,Month,Sales,lag,lead,Output
Group1,42005,1,2503,0,2,3734
Group1,42036,2,3734,0,2,6631
Group1,42064,3,6631,2,3,4276.5
Group1,42095,4,8606,0,0,8606
Group1,42125,5,1889,0,2,3294
Group1,42156,6,4819,1,2,4056.5
Group1,42186,7,3294,1,0,4056.5
Group1,42217,8,38999,2,0,4819
Group1,42248,9,28372,1,0,33685.5
Group1,42278,10,25396,4,1,23244.5
Group1,42309,11,21093,1,0,23244.5
Group2,42339,1,9263,0,3,7961.5
Group2,42005,2,6660,1,3,9263
Group2,42036,3,28595,2,2,9263
Group2,42064,4,123,2,0,6660
Group2,42095,5,11855,3,3,11855
Group2,42125,6,15845,4,3,13850
Group2,42156,7,32331,2,2,15845
Group2,42186,8,3188,1,1,32331
Group2,42217,9,38161,4,0,15845
")
all.equal(df$Output, dout$Output)
# [1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...