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

Скажем, у меня есть набор данных.

structure(list(SKU = c(13284L, 13284L, 13284L, 13284L, 13284L, 
13284L, 13284L, 13284L, 13284L, 13284L, 13284L), stuff = c(4565, 
0, 0, 0, 567.0065222, 0, -1, 73.82897425, -1, 567.0065222, 614.2570658
), action = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L), acnumber = c(329L, 
329L, 329L, 329L, 329L, 329L, 329L, 329L, 329L, 329L, 329L), 
    year = c(2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 
    2018L, 2018L, 2018L, 2018L)), .Names = c("SKU", "stuff", 
"action", "acnumber", "year"), class = "data.frame", row.names = c(NA, 
-11L))

Столбец действия имеет только два значения 0 и 1. Как мы видим, есть 1 наблюдение за вещами из 1 категории и 10 наблюдений за вещами из нулевой категории.

1. Мне нужно вычислить медиану трех последних наблюдений, но все, что меньше или равно нулю в столбце Stuff, не требуется.Так что я должен работать с тремя последними акциями.Кол-во вещей по категории 0 действий.

567,0065222
73,8289742
567,0065222

the median =567,0065

Теперь я должен взять одно значение категории 1 действия и вычесть из него вычисленную медиану

614,2570658-567,0065222 = 47,2505436

Я делаю это

AwesomeData %>% {.[.$stuff>0,]} %>% {.[.$action==0,]} %>% tail(3) %>% {median(.$stuff)} -> OURMEDIANA
AwesomeData %>% {.[.$action==1,]} %>% {.$stuff}-OURMEDIANA -> WHATWENEED
a=cbind(AwesomeData,WHATWENEED)

но что, если у меня есть две группы, подобные

structure(list(SKU = c(13284L, 13284L, 13284L, 13284L, 13284L, 
13284L, 13284L, 13284L, 13284L, 13284L, 13284L, 13285L, 13285L, 
13285L, 13285L, 13285L, 13285L, 13285L, 13285L, 13285L, 13285L, 
13285L), stuff = c(4565, 0, 0, 0, 567.00652, 0, -1, 73.82897, 
-1, 567.00652, 614.25707, 4565, 0, 0, 0, 567.00652, 0, -1, 73.82897, 
-1, 567.00652, 614.25707), action = c(0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L
), acnumber = c(329L, 329L, 329L, 329L, 329L, 329L, 329L, 329L, 
329L, 329L, 329L, 330L, 330L, 330L, 330L, 330L, 330L, 330L, 330L, 
330L, 330L, 330L), year = c(2018L, 2018L, 2018L, 2018L, 2018L, 
2018L, 2018L, 2018L, 2018L, 2018L, 2018L, 2017L, 2017L, 2017L, 
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L)), .Names = c("SKU", 
"stuff", "action", "acnumber", "year"), class = "data.frame", row.names = c(NA, 
-22L))

Теперь у нас есть новая группа

SKU +acnumber+year
13285+330+2017

какчтобы использовать эту строку для всех групп в наборе данных

в качестве вывода, я вижу

     SKU    stuff action acnumber  year   new
   <int>    <dbl>  <int>    <int> <int> <dbl>
 1 13284  4565         0      329  2018  3998
 2 13284     0         0      329  2018 - 567
 3 13284     0         0      329  2018 - 567
 4 13284     0         0      329  2018 - 567
 5 13284   567         0      329  2018     0
 6 13284     0         0      329  2018 - 567
 7 13284 -   1.00      0      329  2018 - 568
 8 13284    73.8       0      329  2018 - 493
 9 13284 -   1.00      0      329  2018 - 568
10 13284   567         0      329  2018     0

, но я должен видеть

SKU acnumber    year    result  
13284   329 2018    47,25055    
13285   330 2017    47,25055    614,25707-median of three last obs. Of zero (567,00652)

1 Ответ

0 голосов
/ 09 июня 2018

Мы можем сделать группу по 'SKU', 'acnumber', 'year', подмножество последних 3 наблюдений stuff, где 'action' равно 0, а 'stuff' положительно, взять median и вычестьиз последнего наблюдения «вещи», где «действие» 1

library(dplyr)
df2 %>% 
  group_by(SKU, acnumber, year) %>% 
  summarise(new = tail(stuff[action ==1], 1) -  
                   median(tail(stuff[action == 0 & stuff > 0], 3)))
# A tibble: 2 x 4
# Groups:   SKU, acnumber [?]
#    SKU acnumber  year   new
#  <int>    <int> <int> <dbl>
#1 13284      329  2018  47.3
#2 13285      330  2017  47.3
...