r - 计算最大日期间隔 - R
问题描述
挑战是具有一个组变量 ( id
) 和两个日期变量 (start
和stop
) 的 data.frame。日期间隔是不规则的,我试图从start
每组的第一个日期开始计算不间断的间隔。
示例数据:
data <- data.frame(
id = c(1, 2, 2, 3, 3, 3, 3, 3, 4, 5),
start = as.Date(c("2016-02-18", "2016-12-07", "2016-12-12", "2015-04-10",
"2015-04-12", "2015-04-14", "2015-05-15", "2015-07-14",
"2010-12-08", "2011-03-09")),
stop = as.Date(c("2016-02-19", "2016-12-12", "2016-12-13", "2015-04-13",
"2015-04-22", "2015-05-13", "2015-07-13", "2015-07-15",
"2010-12-10", "2011-03-11"))
)
> data
id start stop
1 1 2016-02-18 2016-02-19
2 2 2016-12-07 2016-12-12
3 2 2016-12-12 2016-12-13
4 3 2015-04-10 2015-04-13
5 3 2015-04-12 2015-04-22
6 3 2015-04-14 2015-05-13
7 3 2015-05-15 2015-07-13
8 3 2015-07-14 2015-07-15
9 4 2010-12-08 2010-12-10
10 5 2011-03-09 2011-03-11
目标是这样的data.frame:
id start stop duration_from_start
1 1 2016-02-18 2016-02-19 2
2 2 2016-12-07 2016-12-12 7
3 2 2016-12-12 2016-12-13 7
4 3 2015-04-10 2015-04-13 34
5 3 2015-04-12 2015-04-22 34
6 3 2015-04-14 2015-05-13 34
7 3 2015-05-15 2015-07-13 34
8 3 2015-07-14 2015-07-15 34
9 4 2010-12-08 2010-12-10 3
10 5 2011-03-09 2011-03-11 3
或这个:
id start stop duration_from_start
1 1 2016-02-18 2016-02-19 2
2 2 2016-12-07 2016-12-13 7
3 3 2015-04-10 2015-05-13 34
4 4 2010-12-08 2010-12-10 3
5 5 2011-03-09 2011-03-11 3
重要的是要确定从行6
到的差距7
并将这一点作为最大间隔(34
天)。间隔2018-10-01
将2018-10-01
被计为1
。
我常用的lubridate
方法不适用于此示例 ( interval %within lag(interval)
)。
任何想法?
解决方案
library(magrittr)
library(data.table)
setDT(data)
first_int <- function(start, stop){
ind <- rleid((start - shift(stop, fill = Inf)) > 0) == 1
list(start = min(start[ind]),
stop = max(stop[ind]))
}
newdata <-
data[, first_int(start, stop), by = id] %>%
.[, duration := stop - start + 1]
# id start stop duration
# 1: 1 2016-02-18 2016-02-19 2 days
# 2: 2 2016-12-07 2016-12-13 7 days
# 3: 3 2015-04-10 2015-05-13 34 days
# 4: 4 2010-12-08 2010-12-10 3 days
# 5: 5 2011-03-09 2011-03-11 3 days
推荐阅读
- c# - texbox 的 SSRS 值表达式使用没有范围的聚合表达式。多个数据集,多个表
- excel - VBA(Excel)平均更精确,工作表函数或逐步
- azure - 无法获取 Azure Oauth2 令牌
- c++ - Clang 拒绝编译 libstdc++ 的
标题 - laravel - 我有这个错误 SQLSTATE[42S22]: Column not found: 1054 Unknown column '0' in 'where 子句'
- c# - 无法将类型“F_M.Commitment_Ledger_Data__Public_Type”隐式转换为“F_M.Commitment_Ledger_Data__Public_Type[]”
- asp.net-mvc - 在 ASP.NET Core MVC 中记录访问者会话
- javascript - 从日期数组中减去 1 个月
- cqrs - Command Dispatcher 和 Mediator 设计模式有什么区别?
- java - Spring项目-在jsp页面中显示mysql表数据