【问题标题】:R Group and Sum by Time period and Factor variablesR 按时间段和因子变量分组和求和
【发布时间】:2017-05-29 10:53:05
【问题描述】:

我之前发布过这个问题的解释很糟糕,所以我删除了它并重试这个问题。我还更新了示例以更简洁。

我有以下带有事件的案例的玩具数据集。它包括案例 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 天的时间段 AND 事件类型汇总(求和)这些值。 诀窍在于 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 无济于事。任何帮助都会很有价值!

干杯

【问题讨论】:

  • 您应该将问题标记为已回答,否则它将保留在未回答问题类别中。选择您最喜欢的解决方案。
  • 谢谢,我很清楚这一点,我正忙于更多的测试,一旦我决定要使用哪一个,我就会选择最好的。目前我正在解决内存问题 - 所以你可以理解,如果我用完了 64Gb,我将无法在几分钟内选择一个。

标签: r


【解决方案1】:

这是一个data.table解决方案

library(data.table)
dt_results<-fread("test2.csv") #just reading the data
dt_results[,c("EventDate","CaseDate"):=list(as.Date(EventDate),as.Date(CaseDate))]
dt_results[,Period:=as.numeric(ceiling((EventDate-CaseDate+1)/5))] #constructing your period variable
dt_results[, sum(Value),by=c("ID","Period", "Etype")] #sum and group

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

【讨论】:

  • 你的内存是迄今为止最快和最简单的。我只添加了完整的功能,以防我需要 0 个事件。现在我看到了解决方案,它实际上非常简单,只是没有卡到位。发送很多!
【解决方案2】:

请注意,输出不同,因为我认为您的周期计算不正确。您的样本数据的最大差异是约 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

【讨论】:

  • 你说得对,我的输出有误。很抱歉花了这么长时间才回来。这是 100% 的工作。
【解决方案3】:

这是使用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

【讨论】:

  • 也可以 100% 工作,是最简单的解决方案,我喜欢 0 个句点,因为它会减少我的输出。它运行非常缓慢 - 我的输出是 ~100M 行
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 2017-02-14
  • 1970-01-01
  • 2017-10-21
  • 2019-02-24
  • 1970-01-01
相关资源
最近更新 更多