根据给定天数的时间窗口对观察结果进行分组

时间:2017-05-27 12:32:39

标签: r dataframe sum lag

这是我的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值)到CountDay 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}}排名。

有什么建议吗?

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