【问题标题】:Find the number of day intervals for each group找出每组的间隔天数
【发布时间】:2016-08-11 15:59:36
【问题描述】:

假设我有以下数据集

data
    Group       Date
    A        2016-03-10
    A        2016-03-11
    A        2016-03-12
    A        2016-04-13
    A        2016-04-14
    A        2016-05-15
    A        2016-05-16
    A        2016-05-17
    B        2016-02-11
    B        2016-02-12
    B        2016-02-13
    B        2016-02-19
    B        2016-03-15

我想为每个组找到不同的日期间隔。例如,对于 A 组,2016-03-10 到 2016-03-12 应该是区间 1,2016-04-13 到 2016-04-14 应该是区间 2,2016-05-15 到 2016-05-17应该是间隔 3。我想找出所有休息的地方以及每组发生了多少次休息。这样我就可以分析了。这应该为每个组计算。以下应该是我理想的输出,

Group       Date         Interval
A        2016-03-10         1
A        2016-03-11         1
A        2016-03-12         1
A        2016-04-13         2
A        2016-04-14         2
A        2016-05-15         3
A        2016-05-16         3
A        2016-05-17         3
B        2016-02-11         1
B        2016-02-12         1
B        2016-02-13         1
B        2016-02-19         2
B        2016-03-15         3 

以下是我的尝试,

data %>% group_by(Group) %>% mutate(Date - lag(Date)) . 

这给出了第一行的 NA 输出,当日期更改时为 1,当日期不变时为 0。但我想要每个日期间隔为 1,2,3 之类的东西。

更新了无法正常工作的数据集,

 group       date     count
(factor)    (date)
1 Albany 2016-02-15    55
2 Albany 2016-02-16     1
3 Albany 2016-04-08    40

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以在差异向量上cumsum,当差异不是1 时,该值指定为TRUE

    df %>% 
           group_by(Group) %>% 
           mutate(Interval = cumsum(Date - lag(Date, default = first(Date)) != 1))
    
    # Source: local data frame [13 x 3]
    # Groups: Group [2]
    
    #    Group       Date Interval
    #   <fctr>     <date>    <int>
    #1       A 2016-03-10        1
    #2       A 2016-03-11        1
    #3       A 2016-03-12        1
    #4       A 2016-04-13        2
    #5       A 2016-04-14        2
    #6       A 2016-05-15        3
    #7       A 2016-05-16        3
    #8       A 2016-05-17        3
    #9       B 2016-02-11        1
    #10      B 2016-02-12        1
    #11      B 2016-02-13        1
    #12      B 2016-02-19        2
    #13      B 2016-03-15        3
    

    数据

    df = structure(list(Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
        Date = structure(c(16870, 16871, 16872, 16904, 16905, 16936, 
        16937, 16938, 16842, 16843, 16844, 16850, 16875), class = "Date")), .Names = c("Group", 
    "Date"), row.names = c(NA, -13L), class = "data.frame")
    

    【讨论】:

    • 我收到命令的“视图错误:需要单个值”的错误。直到日期 - lag(date) 之前都可以,但在那之后,当我们给出默认值 = first(date) 我期待单个值.. 你能帮忙吗?
    • 不太确定。它适用于您给出的示例。你的DateDate 类的列吗?试试lapply(df, class) 看看你的每一列都有什么类。
    • 如果不访问真实数据,真的很难猜测发生了什么。您也可以尝试分离并附加 dplyr 包,看看是否有帮助。
    • 我更新了一段无法正常工作的原始数据。你能检查一下吗?
    • 刚刚检查过。也有效。您使用的是哪个版本的dplyr?尝试升级dplyr,或者尝试default = date[1]替换first功能。
    【解决方案2】:

    这是这个问题的某种重复:Group rows in data frame based on time difference between consecutive rows

    基本上你想做这两个操作:

    df$gap <- c(0, (diff(df$date) > 1)*1) # identify gap between dates larger than 1
    df$group <- cumsum(df$gap) + 1  # cumulative sum of 'gap' variable
    

    【讨论】:

    • 我希望在每个单独的组中都有这个。这个给整个df
    猜你喜欢
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2017-10-31
    • 2019-09-21
    • 2012-10-28
    • 2019-07-25
    相关资源
    最近更新 更多