我之前发布了一个非常糟糕的解释,所以我将其删除并再试一次。我也更新了这个例子,以便更简洁。
我有以下有事件案例的玩具数据集。它包括案例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无济于事。任何帮助都会很有价值!
干杯
答案 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