代码之家  ›  专栏  ›  技术社区  ›  user1165199

计算值在组中最后x行出现的次数

  •  0
  • user1165199  · 技术社区  · 7 年前

    我有一个数据框如下

    dataDF <- data.frame(
      group = c(rep('a', 10), rep('b', 10)),
      value = c(4, 4, 4, 3, 4, 3, 4, 3, 3, 3,
                3, 1, 1, 1, 3, 1, 3, 2, 3, 1)
    )
    

    我想找出过去5个条目中每个值出现在组中的次数(或者如果它还没有5行,那么现在的总数)。

    所以我最后会说:

       group value number_l5
    1      a     4         1
    2      a     4         2
    3      a     4         3
    4      a     3         1
    5      a     4         4
    6      a     3         2
    7      a     4         3
    8      a     3         3
    9      a     3         3
    10     a     3         4
    11     b     3         1
    12     b     1         1
    13     b     1         2
    14     b     1         3
    15     b     3         2
    16     b     1         4
    17     b     3         2
    18     b     2         1
    19     b     3         3
    20     b     1         2
    

    所以前三行,每行的值是4,所以累积计数是1,2,3。第四排是我们第一次看到3,所以计数是1。当你通过第五排的时候,我们只看到过去五排,所以在第七排,我们从第三排数到第七排,得到3。一旦你到了第11排,一个新的组‘B’开始,我们再次开始。

    想做什么 dplyr group_by 如果可能的话

    提前谢谢

    编辑:最初要求的比例,使更简单,希望更清楚已改为要求数字。为任何困惑道歉!

    2 回复  |  直到 7 年前
        1
  •  3
  •   akuiper    7 年前

    你可以使用 zoo::rollapply 为此;此处将窗口大小设置为 5 partial=T 包括前几个要素; sum(v == tail(v, 1)) 计算每个窗口中最后一个元素出现的次数:

    library(dplyr)
    library(zoo)
    
    dataDF %>% 
        group_by(group) %>% 
        mutate(proportion = rollapply(value, 5, function(v) sum(v == tail(v, 1)), partial=T, align='right'))
    
    # A tibble: 20 x 3
    # Groups:   group [2]
    #   group value proportion
    #   <fct> <dbl>      <int>
    # 1 a         4          1
    # 2 a         4          2
    # 3 a         4          3
    # 4 a         3          1
    # 5 a         4          4
    # 6 a         3          2
    # 7 a         4          3
    # 8 a         3          3
    # 9 a         3          3
    #10 a         3          4
    #11 b         3          1
    #12 b         1          1
    #13 b         1          2
    #14 b         1          3
    #15 b         3          2
    #16 b         1          4
    #17 b         3          2
    #18 b         2          1
    #19 b         3          3
    #20 b         1          2
    
        2
  •  0
  •   Onyambu    7 年前
    dataDF%>%
      group_by(group)%>%
      mutate(i=1:n(),value1=list(value))%>%
      group_by(group,i)%>%
      mutate(proportion=mean(value==unlist(value1)[if(i<5)1:i else i:(i-4)]))%>%
      ungroup()%>%
      select(-i,-value1)
    # A tibble: 20 x 3
       group value proportion
       <fct> <dbl>      <dbl>
     1 a        4.      1.00 
     2 a        4.      1.00 
     3 a        4.      1.00 
     4 a        3.      0.250
     5 a        4.      0.800
     6 a        3.      0.400
     7 a        4.      0.600
     8 a        3.      0.600
     9 a        3.      0.600
    10 a        3.      0.800
    11 b        3.      1.00 
    12 b        1.      0.500
    13 b        1.      0.667
    14 b        1.      0.750
    15 b        3.      0.400
    16 b        1.      0.800
    17 b        3.      0.400
    18 b        2.      0.200
    19 b        3.      0.600
    20 b        1.      0.400
    >