基于时间窗口和总和观察对行进行分组

时间:2017-05-26 15:56:27

标签: r dataframe rows

这是我的data.frame的一个例子:

df_1 = read.table(text='ID  Day Episode Count
                  1   30001 7423      47    16
                  2   33021 7423      47    16
                  3   33024 7423      47    16
                  4   33034 7423      47    16
                  5   37018 7423      47    16
                  6   40004 7423      47    16
                  7   40011 7423      47    16
                  8   41028 7423      47    16
                  9   42001 7423      47    16
                  10  42011 7423      47    16
                  11  45003 7423      47    16
                  12  45004 7423      47    16
                  13  45005 7423      47    16
                  14  46006 7423      47    16
                  15  46008 7423      47    16
                  16  47004 7423      47    16
                  17   2001 7438      54    13
                  18  19007 7438      54    13
                  19  20002 7438      54    13
                  20  22006 7438      54    13
                  21  22007 7438      54    13
                  22  29002 7438      54    13
                  23  29003 7438      54    13
                  24  30001 7438      54    13
                  25  30004 7438      54    13
                  26  33023 7438      54    13
                  27  33029 7438      54    13
                  28  41006 7438      54    13
                  29  41020 7438      54    13
                  30  21009 7428      65    12
                  31  24001 7428      65    12
                  32  25005 7428      65    12
                  33  25009 7428      65    12
                  34  27002 7428      65    12
                  35  27003 7428      65    12
                  36  27009 7428      65    12
                  37  30001 7428      65    12
                  38  33023 7428      65    12
                  39  33029 7428      65    12
                  40  33050 7428      65    12
                  41  34003 7428      65    12
                  42  14001 7427      81    10
                  43  16004 7427      81    10
                  44  17001 7427      81    10
                  45  17005 7427      81    10
                  46  19001 7427      81    10
                  47  19006 7427      81    10
                  48  19007 7427      81    10
                  49  19010 7427      81    10
                  50  20001 7427      81    10
                  51  21009 7427      81    10
                  52  28047 7424     143     9
                  53  28049 7424     143     9
                  54  29002 7424     143     9
                  55  29003 7424     143     9
                  56  30003 7424     143     9
                  57  30004 7424     143     9
                  58  32010 7424     143     9
                  59  33014 7424     143     9
                  60  33023 7424     143     9
                  104 30001 6500     111     9
                  105 33021 6500     111     9
                  106 33024 6500     111     9
                  107 33034 6500     111     9
                  108 37018 6500     111     9
                  109 40004 6500     111     9
                  110 40011 6500     111     9
                  111 41028 6500     111     9
                  112 42001 6500     111     9
                  61  25005 7422     158     8
                  62  27021 7422     158     8
                  63  28015 7422     158     8
                  64  28047 7422     158     8
                  65  28049 7422     158     8
                  66  29001 7422     158     8
                  67  29002 7422     158     8
                  68  29003 7422     158     8
                  69  27002 7425     246     6
                  70  27003 7425     246     6
                  71  27021 7425     246     6
                  72  33006 7425     246     6
                  73  34001 7425     246     6
                  74  37019 7425     246     6
                  75  33014 7429     979     5
                  76  33021 7429     979     5
                  77  33024 7429     979     5
                  78  34001 7429     979     5
                  79  35010 7429     979     5
                  80  28022 7426    1199     5
                  81  34006 7426    1199     5
                  82  37006 7426    1199     5
                  83  37008 7426    1199     5
                  84  37018 7426    1199     5
                  85  29001 7437    1756     4
                  86  30014 7437    1756     4
                  87  32010 7437    1756     4
                  88  45004 7437    1756     4
                  89   4003 7430    1757     4
                  90  15013 7430    1757     4
                  91  16004 7430    1757     4
                  92  43007 7430    1757     4
                  93   7002 7434    1570     4
                  94   8006 7434    1570     4
                  95  15006 7434    1570     4
                  96  94001 7434    1570     4
                  113 33024 6499     135     4
                  114 33034 6499     135     4
                  115 37018 6499     135     4
                  116 40004 6499     135     4
                  222  3005 7440     999     2
                  223  3400 7440     999     2  
                  97   3002 7433    2295     2
                  98   4003 7433    2295     2
                  99  48005 7436    3389     2
                  100 49004 7436    3389     2
                  101  8006 7431    3390     2
                  102 15006 7431    3390     2
                  104  6780 7439      22     1
                  103 41020 7435    4511     1', header = TRUE)

data.frame已根据-Count-Day获得此订单,且无法更改。

我需要做的是按Day及其之前的16天(总共17天)对data.frame进行分组,并对Count列的观察结果进行求和。因此,在这种情况下,最大Day观测值最大Count为7438,然后取7438,7437,7436,7435等等,直到7424并将Count值相加。在7438的17天时间窗口中不能包含的下一个Day观察值为6500.然后查找6500,6499等...并按照7438组进行相同操作。并为Day 7440和7439做同样的事。

问题在于,如果我们从Day col的顶部开始向后计数Day,则Day = 7423将包括在其Episode Day = 7422中,并且它们都会被扔掉从被列入Day = 7438剧集。

我们如何编写一个代码,首先分析所有可能的剧集'组合(基于时间窗口)并最终选择覆盖最大天数(不超过时间窗口)的那个?

预期产出:

       ID  Day Episode Count
1    2001 7438       1   103
2   19007 7438       1   103
3   20002 7438       1   103
4   22006 7438       1   103
5   22007 7438       1   103
6   29002 7438       1   103
7   29003 7438       1   103
8   30001 7438       1   103
9   30004 7438       1   103
10  33023 7438       1   103
11  33029 7438       1   103
12  41006 7438       1   103
13  41020 7438       1   103
14  29001 7437       1   103
15  30014 7437       1   103
16  32010 7437       1   103
17  45004 7437       1   103
18  48005 7436       1   103
19  49004 7436       1   103
20  41020 7435       1   103
21   7002 7434       1   103
22   8006 7434       1   103
23  15006 7434       1   103
24  94001 7434       1   103
25   3002 7433       1   103
26   4003 7433       1   103
27   8006 7431       1   103
28  15006 7431       1   103
29   4003 7430       1   103
30  15013 7430       1   103
31  16004 7430       1   103
32  43007 7430       1   103
33  33014 7429       1   103
34  33021 7429       1   103
35  33024 7429       1   103
36  34001 7429       1   103
37  35010 7429       1   103
38  21009 7428       1   103
39  24001 7428       1   103
40  25005 7428       1   103
41  25009 7428       1   103
42  27002 7428       1   103
43  27003 7428       1   103
44  27009 7428       1   103
45  30001 7428       1   103
46  33023 7428       1   103
47  33029 7428       1   103
48  33050 7428       1   103
49  34003 7428       1   103
50  14001 7427       1   103
51  16004 7427       1   103
52  17001 7427       1   103
53  17005 7427       1   103
54  19001 7427       1   103
55  19006 7427       1   103
56  19007 7427       1   103
57  19010 7427       1   103
58  20001 7427       1   103
59  21009 7427       1   103
60  28022 7426       1   103
61  34006 7426       1   103
62  37006 7426       1   103
63  37008 7426       1   103
64  37018 7426       1   103
65  27002 7425       1   103
66  27003 7425       1   103
67  27021 7425       1   103
68  33006 7425       1   103
69  34001 7425       1   103
70  37019 7425       1   103
71  28047 7424       1   103
72  28049 7424       1   103
73  29002 7424       1   103
74  29003 7424       1   103
75  30003 7424       1   103
76  30004 7424       1   103
77  32010 7424       1   103
78  33014 7424       1   103
79  33023 7424       1   103
80  30001 7423       1   103
81  33021 7423       1   103
82  33024 7423       1   103
83  33034 7423       1   103
84  37018 7423       1   103
85  40004 7423       1   103
86  40011 7423       1   103
87  41028 7423       1   103
88  42001 7423       1   103
89  42011 7423       1   103
90  45003 7423       1   103
91  45004 7423       1   103
92  45005 7423       1   103
93  46006 7423       1   103
94  46008 7423       1   103
95  47004 7423       1   103
96  25005 7422       1   103
97  27021 7422       1   103
98  28015 7422       1   103
99  28047 7422       1   103
100 28049 7422       1   103
101 29001 7422       1   103
102 29002 7422       1   103
103 29003 7422       1   103
104 30001 6500       2    13
105 33021 6500       2    13
106 33024 6500       2    13
107 33034 6500       2    13
108 37018 6500       2    13
109 40004 6500       2    13
110 40011 6500       2    13
111 41028 6500       2    13
112 42001 6500       2    13
113 33024 6499       2    13
114 33034 6499       2    13
115 37018 6499       2    13
116 40004 6499       2    13
117  3005 7440       3     3
118  3400 7440       3     3
119  6780 7439       3     3

我的真实数据框架有> 40,000行和> 1600集。

2 个答案:

答案 0 :(得分:0)

可能有更好的方法来实现这一目标,但是这样的事情可能会让你得到你需要的东西。

library(dplyr)
groups <- seq(max(df_1$Day)+1,min(df_1$Day),by = -17)
groups <- rev(append(groups, min(df_1$Day)))

df_1$group <- groups[cut(df_1$Day, breaks = groups, labels = FALSE, right = FALSE)]

df_1 <- df_1 %>%
      group_by(group) %>%
      mutate(TotalPerGroup = sum(Count))

答案 1 :(得分:0)

我也会说dplyr,这是我的50美分:

library(dplyr)
df_1 %>% mutate(Episode=ifelse(Day %in% 7438:7422, 1, 2),
            Count=ifelse(Episode==1, sum(df_1$Count[df_1$Day %in% 7438:7422]),
                         sum(df_1$Count[df_1$Day %in% 6500:6499]))) %>%
arrange(-Day, ID)

也许你可以用40,000行的这些片段编写一个方便的功能。