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

R基于时间间隔和密钥的年度聚合,r,dplyr,R,Dplyr,我有一个问题,我知道如何用SQL解决,但在R中却不能很好地解决。这似乎是一个用dpylr轻松解决的任务,但我正在寻找输入 我有一个与开始和结束时间相关联的位置列表。这些日期标记位置处于活动状态的时间段 我想输出一个任意间隔之间的所有年份的表,每个年份都有计数(活动位置)。如果某个位置在该年的任何时间处于活动状态,则该位置处于活动状态,并且不应被计算多次 实例 考虑到以下数据: ╔════════════╦═════════════════════╦═════════════════════╗ ║

我有一个问题,我知道如何用SQL解决,但在R中却不能很好地解决。这似乎是一个用
dpylr
轻松解决的任务,但我正在寻找输入

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

我想输出一个任意间隔之间的所有年份的表,每个年份都有
计数(活动位置)
。如果某个位置在该年的任何时间处于活动状态,则该位置处于活动状态,并且不应被计算多次

实例 考虑到以下数据:

╔════════════╦═════════════════════╦═════════════════════╗
║ 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 ║
╚════════════╩═════════════════════╩═════════════════════╝

如能就最佳方法提供任何指导,将不胜感激。谢谢大家!

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

库(lubridate)
图书馆(dplyr)
mydf温度
sapply(1:nrow(温度)、功能(x){
seq(温度[x,2],温度[x,3],比=1)})%>%
未列出%>%
表%>%
数据帧
#      . 频率
#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

谢谢;我会尝试一下,如果发现任何调整,我会报告回来。@DonScott OK。让我知道它是如何运行的。所以这在我的完整数据集上实际上不起作用。在我的2999结果中,我得到了奇怪的年份,而这些年份不在原始数据中。此外,计数与实际值不符。@DonScott听到这个消息我很难过。我希望我能帮助你,但我没有你的实际数据。在您的问题中,您有一些表,例如,这些表并没有告诉SO用户每列的类。最好使用
dput()
并创建一个最小的示例。通过这种方式,您将能够获得支持,这将适用于您的实际数据集。对于我的数据,我需要做同样的事情,它可以很好地使用Jazzurros示例。但是使用我自己的数据,我得到了错误“error in is.finite(if(is.character(from))from=as.numeric(from else-from):没有为类型“list”实现默认方法。经过一些搜索,我发现我需要将data.frame转换为具有as.matrix()的矩阵。这解决了问题。
╔══════╦═══════════════╗
║ 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             ║
╚══════╩═══════════════╝
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