我遇到一个问题,我知道如何在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 ║
╚══════╩═══════════════╝
对于最佳方法的任何指导将不胜感激。谢谢!
答案 0 :(得分:4)
这是一种方法。我根据您上面的数据创建了一个示例数据。首先,我从start
和end
中提取年份信息,并使用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