这是我的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集。
答案 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行的这些片段编写一个方便的功能。