这是我的data.frame的一个例子:
df = read.table(text = 'ID Day Episode Count
28047 6000 143 7
28049 6000 143 7
29002 6000 143 7
29003 6000 143 7
30003 6000 143 7
30004 6000 143 7
32010 6000 143 7
30001 7436 47 6
33021 7436 47 6
33024 7436 47 6
33034 7436 47 6
37018 7436 47 6
40004 7436 47 6
29003 7300 111 6
30003 7300 111 6
30004 7300 111 6
32010 7300 111 6
30001 7300 111 6
33021 7300 111 6
2001 7438 54 5
19007 7438 54 5
20002 7438 54 5
22006 7438 54 5
22007 7438 54 5
32010 7301 99 5
30001 7301 99 5
33021 7301 99 5
2001 7301 99 5
19007 7301 99 5
27021 5998 158 5
28015 5998 158 5
28047 5998 158 5
28049 5998 158 5
29001 5998 158 5
21009 7437 65 4
24001 7437 65 4
25005 7437 65 4
25009 7437 65 4
14001 7435 81 4
16004 7435 81 4
17001 7435 81 4
17005 7435 81 4
21009 7299 77 4
24001 7299 77 4
25005 7299 77 4
25009 7299 77 4
29002 5996 158 4
29003 5996 158 4
27002 5996 158 4
27003 5996 158 4
33014 5999 56 3
33023 5999 56 3
25005 5999 56 3
27021 5995 246 2
33006 5995 246 2
8876 7439 765 2
5421 7439 765 2
6678 7298 68 1
34001 5994 125 1
4432 7440 841 1', header = TRUE)
我需要做的是为每个独特的Day
观察查找其Count
值,并将其添加到前3天Count
个(即4天时间窗口)
e.g。 1)Day
= 6000,总和7(Count
值)到Count
值Day
5999,5998和5997(df
中不存在的最后一个值}),分别为3,5和0 - > 7 + 3 + 5 + 0 = new_Count
15;
2)下一个Day
= 7436,总和6到Count
值7435,7434和7433 - > 6 + 4 + 0 + 0 = new_Count
10;
依此类推,直至Day
内的最后df
。
期望的输出:
ID Day new_Episode new_Count
2001 7438 1 19
19007 7438 1 19
20002 7438 1 19
22006 7438 1 19
22007 7438 1 19
21009 7437 1 19
24001 7437 1 19
25005 7437 1 19
25009 7437 1 19
30001 7436 1 19
33021 7436 1 19
33024 7436 1 19
33034 7436 1 19
37018 7436 1 19
40004 7436 1 19
14001 7435 1 19
16004 7435 1 19
17001 7435 1 19
17005 7435 1 19
8876 7439 2 17
5421 7439 2 17
2001 7438 2 17
19007 7438 2 17
20002 7438 2 17
22006 7438 2 17
22007 7438 2 17
21009 7437 2 17
24001 7437 2 17
25005 7437 2 17
25009 7437 2 17
30001 7436 2 17
33021 7436 2 17
33024 7436 2 17
33034 7436 2 17
37018 7436 2 17
40004 7436 2 17
32010 7301 3 16
30001 7301 3 16
33021 7301 3 16
2001 7301 3 16
19007 7301 3 16
29003 7300 3 16
30003 7300 3 16
30004 7300 3 16
32010 7300 3 16
30001 7300 3 16
33021 7300 3 16
21009 7299 3 16
24001 7299 3 16
25005 7299 3 16
25009 7299 3 16
6678 7298 3 16
28047 6000 4 15
28049 6000 4 15
29002 6000 4 15
29003 6000 4 15
30003 6000 4 15
30004 6000 4 15
32010 6000 4 15
33014 5999 4 15
33023 5999 4 15
25005 5999 4 15
27021 5998 4 15
28015 5998 4 15
28047 5998 4 15
28049 5998 4 15
29001 5998 4 15
21009 7437 5 14
24001 7437 5 14
25005 7437 5 14
25009 7437 5 14
30001 7436 5 14
33021 7436 5 14
33024 7436 5 14
33034 7436 5 14
37018 7436 5 14
40004 7436 5 14
14001 7435 5 14
16004 7435 5 14
17001 7435 5 14
17005 7435 5 14
4432 7440 6 12
8876 7439 6 12
5421 7439 6 12
2001 7438 6 12
19007 7438 6 12
20002 7438 6 12
22006 7438 6 12
22007 7438 6 12
21009 7437 6 12
24001 7437 6 12
25005 7437 6 12
25009 7437 6 12
33014 5999 7 12
33023 5999 7 12
25005 5999 7 12
27021 5998 7 12
28015 5998 7 12
28047 5998 7 12
28049 5998 7 12
29001 5998 7 12
29002 5996 7 12
29003 5996 7 12
27002 5996 7 12
27003 5996 7 12
29003 7300 8 11
30003 7300 8 11
30004 7300 8 11
32010 7300 8 11
30001 7300 8 11
33021 7300 8 11
21009 7299 8 11
24001 7299 8 11
25005 7299 8 11
25009 7299 8 11
6678 7298 8 11
27021 5998 9 11
28015 5998 9 11
28047 5998 9 11
28049 5998 9 11
29001 5998 9 11
29002 5996 9 11
29003 5996 9 11
27002 5996 9 11
27003 5996 9 11
27021 5995 9 11
33006 5995 9 11
30001 7436 10 10
33021 7436 10 10
33024 7436 10 10
33034 7436 10 10
37018 7436 10 10
40004 7436 10 10
14001 7435 10 10
16004 7435 10 10
17001 7435 10 10
17005 7435 10 10
29002 5996 11 7
29003 5996 11 7
27002 5996 11 7
27003 5996 11 7
27021 5995 11 7
33006 5995 11 7
34001 5994 11 7
21009 7299 12 5
24001 7299 12 5
25005 7299 12 5
25009 7299 12 5
6678 7298 12 5
14001 7435 13 4
16004 7435 13 4
17001 7435 13 4
17005 7435 13 4
27021 5995 14 3
33006 5995 14 3
34001 5994 14 3
6678 7298 15 1
34001 5994 16 1
请注意,output_df
大于df
(但没关系),并按-new_Count
和-Day
排列new_Episode
列相应{ {1}}排名。
有什么建议吗?
答案 0 :(得分:1)
所以我不确定为什么output_df
的行数比原始data.frame
多,但我们可以使用by
函数和subset
来计算{ {1}}。请注意,我已拨打您的new_Count
data.frame
而不是df1
。
df
要获取output_df1 <- do.call('rbind', by(df1, list(df1$Day, df1$ID), FUN = function(d){
#grab subset of df
sub_df <- subset(df1, Day < d$Day & Day > (d$Day - 4))
#select unique day, count
sub_df_u <- unique(sub_df[,-1])
d$new_Count <- sum(sub_df_u$Count) + d$Count
d
}))
head(output_df1)
ID Day Episode Count new_Count
14 2001 7438 54 5 15
28 14001 7435 81 4 4
29 16004 7435 81 4 4
30 17001 7435 81 4 4
31 17005 7435 81 4 4
15 19007 7438 54 5 15
列,我们可以使用 new_Episode
包中的dense_rank
功能:
dplyr