如何在R中减去组中三个观察值的中位数

时间:2018-06-09 15:19:47

标签: r dplyr plyr

说,我有数据集。

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个观察,0个类别的东西有10个观察。

1.我必须计算最后三次观察的中位数,但不需要在Stuff列中小于或等于零。所以我必须与最后三个人合作。 0个动作类别的colums of colums。

567,0065222
73,8289742
567,0065222

the median =567,0065
  1. 现在,我必须取一个1行动类别的值并从中减去计算出的中位数

    614,2570658-567,0065222 = 47,2505436

  2. 我这样做

    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 :(得分:1)

我们可以通过'SKU','acnumber','year'进行分组,对stuff的最后3个观察进行子集,其中'action'为0且'stuff'为正,取{{1并且从最后的“东西”观察中减去'动作'为1

median