我的问题很容易解释:
- 我有一个表格,其中包含开始日期和结束日期以及按"开始日期"排序的 n 行(请参见下面的图像 - 黄色行是我想在具有第一个开始日期和最后一个结束日期的唯一行上的行)
包含日期后跟行的表格
- 我想在开始日期 n+1 == 结束日期 n时将日期重新分组一行。这是我作为需要的示例(下图)
我需要的结果
我尝试用于比较日期的两个向量(从列中提取的向量)的循环,但它并没有真正起作用......
我尝试了这样的东西来确定开始日期和结束日期:
'''
a = sort(data$Date_debut)
b = sort(data$Date_fin)
for(i in 1:(length(a)-1)){
for(j in 2:length(a)){
datedeb = a[j-1]
if(b[i]+1 == a[j]){
while(b[i]+1 == a[j] ){
datefin = b[i+1]
i = i+1}
}
}
}
''' datedeb = 开始日期 日期FIN = 结束日期
感谢您的帮助,我对处理此问题的想法/方法持开放态度。
这是使用tidyverse
的一种方法。对于每个Var1
组,根据开始日期不等于上一行结束日期的时间创建包含索引的子组(将这些行与同一索引保持在一起)。然后,您可以将Var1
和索引同时group_by
,并使用first
开始日期和last
结束日期作为日期范围。
library(tidyverse)
df %>%
group_by(Var1) %>%
mutate(i = cumsum(Start_date != lag(End_date, default = as.Date(-Inf)) + 1)) %>%
group_by(i, .add = T) %>%
summarise(Start_date = first(Start_date), End_date = last(End_date)) %>%
select(-i)
输出
Var1 Start_date End_date
<chr> <date> <date>
1 A 2019-01-02 2019-04-09
2 A 2019-10-11 2019-10-11
3 B 2019-12-03 2019-12-20
4 C 2019-12-29 2019-12-31
数据
df <- structure(list(Var1 = c("A", "A", "A", "A", "B", "C"), Start_date = structure(c(17898,
17962, 17993, 18180, 18233, 18259), class = "Date"), End_date = structure(c(17961,
17992, 17995, 18180, 18250, 18261), class = "Date")), class = "data.frame", row.names = c(NA,
-6L))