【问题标题】:R Aggregation on Year based on Time Interval and Key基于时间间隔和键的年份 R 聚合
【发布时间】:2015-11-23 09:30:43
【问题描述】:

我有一个问题,我知道如何在 SQL 中解决,但在 R 中却不优雅地。这似乎是通过dpylr 轻松解决的任务,但我正在寻找输入。 p>

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

我想用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             ║
╚══════╩═══════════════╝

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是一种方法。我根据您上面的数据创建了一个示例数据。首先,我从startend 中提取了年份信息,并使用year() 创建了两个新列,您可以在lubridate 或data.table 中找到它们。然后,对于每一行,我在sapply() 中使用seq() 创建了一个年份序列。在这个阶段你有一个清单。你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
    

    【讨论】:

    • 谢谢;如果我发现任何调整,我会尝试并报告。
    • @DonScott 好的。告诉我进展如何。
    • 所以这实际上不适用于我的完整数据集。在我的结果 2999 中,我得到了奇怪的年份,这些年份不在原始数据中。此外,计数与实际值不对应。
    • @DonScott 很遗憾听到这个消息。我希望我能帮助你,但我没有你的实际数据。例如,在您的问题中,您有表格,它不会告诉 SO 用户每列的类别。最好的办法是使用dput() 并创建一个最小示例。这样,您将能够获得适用于您的实际数据集的支持。
    • 有了我的数据,我需要做同样的事情,它可以使用 Jazzurros 的例子就好了。但是用我自己的数据我得到错误“is.finite中的错误(if(is.character(from))来自= as.numeric(来自else from):默认方法没有为类型'list'实现”。经过一番搜索,发现需要用as.matrix()将data.frame转成矩阵,这样就解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多