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