R Group和Sum by Time period和Factor变量

时间:2017-05-29 10:53:06

标签: r

我之前发布了一个非常糟糕的解释,所以我将其删除并再试一次。我也更新了这个例子,以便更简洁。

我有以下有事件案例的玩具数据集。它包括案例ID,案例开始日期,事件日期,事件类型和事件值。它包含两种情况(C1和C2)和两种事件类型(A& B)。在真实数据中,我有1000个案例和100个事件。

ID      CaseDate    EventDate       Etype   Value
C1      2017-01-01  2017-01-01      A       1
C1      2017-01-01  2017-01-04      A       2
C1      2017-01-01  2017-01-11      A       3
C1      2017-01-01  2017-01-13      B       1
C1      2017-01-01  2017-01-15      B       2
C1      2017-01-01  2017-02-01      A       5
C1      2017-01-01  2017-02-04      A       6
C2      2017-01-03  2017-02-10      B       3
C2      2017-01-03  2017-02-11      B       1
C2      2017-01-03  2017-02-26      A       1
C2      2017-01-03  2017-02-27      A       1
C2      2017-01-03  2017-02-28      B       4

我的任务是按 5天的时间段 事件类型汇总(总和)值。 诀窍是5天时段来自特定的案例开始日期。因此,对于C1,它将是2017-01-01至2017-01-05(期间1)& 2017-01-06至2017-01-10(期间2)等。

对于C2,它将是2017-01-03至2017-01-07(期间1)& 2017-01-08至2017-01-12(期间2)等。

最终,我希望得到如下结果集:

ID  Period  Etype   Sum
C1  1       A       3
C1  1       B       0
C1  2       A       0
C1  2       B       0
C1  3       A       3
C1  3       B       3
C1  4       A       0
C1  4       B       0
C1  5       A       0
C1  5       B       0
C1  6       A       0
C1  6       B       0
C1  7       A       0
C1  7       B       0
C1  8       A       11
C1  8       B       0
C2  1       A       0
C2  1       B       0
C2  2       A       0
C2  2       B       4
C2  3       A       0
C2  3       B       0
C2  4       A       0
C2  4       B       0
C2  5       A       2
C2  5       B       0
C2  6       A       0
C2  6       B       4
C2  7       A       0
C2  7       B       0
C2  8       A       0
C2  8       B       0

我已经尝试了所有可以找到的答案,但没有一个符合要求。我曾尝试使用xts包和& lubridate以及dplyr无济于事。任何帮助都会很有价值!

干杯

3 个答案:

答案 0 :(得分:1)

这是object解决方案

data.table

希望我已经正确地理解了你想做什么......否则让我知道我哪里出错...

答案 1 :(得分:1)

请注意,输出不同,因为我认为您的周期计算不正确。样本数据的最大差异是~60天,即12天的五天。

library(dplyr)
library(lubridate)
library(tidyr)
df %>%
  mutate(CaseDate = ymd(CaseDate),
         EventDate = ymd(EventDate), 
         Period = as.integer(1 + (as.integer(EventDate - CaseDate) %/% 5))) %>%
  group_by(ID, Period, Etype) %>%
  summarize(Sum = sum(Value)) %>%
  ungroup() %>%
  complete(ID, Period = full_seq(Period, 1), Etype, fill = list(Sum = 0)) %>%
  arrange(ID, Period, Etype) 

#        ID Period  Etype   Sum
#    <fctr>  <dbl> <fctr> <dbl>
# 1      C1      1      A     3
# 2      C1      1      B     0
# 3      C1      2      A     0
# 4      C1      2      B     0
# 5      C1      3      A     3
# 6      C1      3      B     3
# 7      C1      4      A     0
# 8      C1      4      B     0
# 9      C1      5      A     0
# 10     C1      5      B     0
# # ... with 38 more rows

答案 2 :(得分:1)

这是一个使用xtabs的(接近)解决方案,它不包含没有条目的句点(在较大的实际数据表中可能不是问题)...

df2 <- as.data.frame(xtabs(Value~ID+ceiling(as.numeric(EventDate-CaseDate+1)/5)+Etype,df))
names(df2)[2] <- "Period"
names(df2)[4] <- "Sum"
df2 <- df2[order(df2$ID,df2$Period,df2$Etype),]

df2
   ID Period Etype  Sum
1  C1      1     A    3
13 C1      1     B    0
3  C1      3     A    3
15 C1      3     B    3
5  C1      7     A   11
17 C1      7     B    0
7  C1      8     A    0
19 C1      8     B    0
9  C1     11     A    0
21 C1     11     B    0
11 C1     12     A    0
23 C1     12     B    0
2  C2      1     A    0
14 C2      1     B    0
4  C2      3     A    0
16 C2      3     B    0
6  C2      7     A    0
18 C2      7     B    0
8  C2      8     A    0
20 C2      8     B    4
10 C2     11     A    1
22 C2     11     B    0
12 C2     12     A    1
24 C2     12     B    4