基于时间间隔和密钥的年度R聚合

时间:2015-11-23 00:56:41

标签: r dplyr

我遇到一个问题,我知道如何在SQL中解决,但在R中没有优雅地。这似乎是一个很容易用dpylr解决的任务,但我正在寻找输入。

我有一个与 开始 结束 关联的位置列表。这些日期标记了位置活动的时间段。

我希望每年在COUNT(active locations)的任意间隔之间输出所有年份的表格。如果某个位置处于活动状态,如果该位置在该年度的任何时间点处于活动状态,则不应计入多次。

实施例

考虑以下数据:

╔════════════╦═════════════════════╦═════════════════════╗
║ LocationID ║ StartDate <POSIXlt> ║ EndDate <POSIXlt>   ║
╠════════════╬═════════════════════╬═════════════════════╣
║ 0          ║ 2000-01-01 00:00:00 ║ 2001-01-01 12:00:00 ║
║ 1          ║ 2000-01-01 00:00:00 ║ 2010-01-01 12:00:00 ║
║ 2          ║ 2009-01-01 12:00:00 ║ 2015-06-01 00:00:00 ║
║ 0          ║ 2001-12-01 00:00:00 ║ 2010-01-01 12:00:00 ║
╚════════════╩═════════════════════╩═════════════════════╝

2000年至2015年的理想产出是:

╔══════╦═══════════════╗
║ Year ║ Count(active) ║
╠══════╬═══════════════╣
║ 2000 ║ 2             ║
║ 2001 ║ 2             ║
║ 2002 ║ 2             ║
║ 2003 ║ 2             ║
║ 2004 ║ 2             ║
║ 2005 ║ 2             ║
║ 2006 ║ 2             ║
║ 2007 ║ 2             ║
║ 2008 ║ 2             ║
║ 2009 ║ 3             ║
║ 2010 ║ 3             ║
║ 2011 ║ 1             ║
║ 2012 ║ 1             ║
║ 2013 ║ 1             ║
║ 2014 ║ 1             ║
║ 2015 ║ 1             ║
╚══════╩═══════════════╝

对于最佳方法的任何指导将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:4)

这是一种方法。我根据您上面的数据创建了一个示例数据。首先,我从startend中提取年份信息,并使用year()创建两个新列,您可以在lubridate或data.table中找到它们。然后,对于每一行,我使用seq()中的sapply()创建了一系列年份。你现阶段有一份清单。您unlist()列表,并计算每年出现的次数(table())。最后,您使用data.frame()转换表格。

library(lubridate)
library(dplyr)

mydf <- data.frame(ID = c(0,1,2,0),
                   start = as.POSIXct(c("2000-01-01 00:00:00", "2000-01-01 00:00:00",
                                        "2009-01-01 12:00:00", "2001-12-01 00:00:00")),
                   end = as.POSIXct(c("2001-01-01 12:00:00", "2010-01-01 12:00:00",
                                      "2015-06-01 00:00:00", "2010-01-01 12:00:00")))


mutate_each(mydf, funs(year(.)), start:end) -> temp

sapply(1:nrow(temp), function(x){

            seq(temp[x, 2], temp[x, 3], by = 1)}) %>%
unlist %>%
table %>%
data.frame

#      . Freq
#1  2000    2
#2  2001    3
#3  2002    2
#4  2003    2
#5  2004    2
#6  2005    2
#7  2006    2
#8  2007    2
#9  2008    2
#10 2009    3
#11 2010    3
#12 2011    1
#13 2012    1
#14 2013    1
#15 2014    1
#16 2015    1