处理 R 中 table 中的以下日期
Deal with following dates in a table in R
我的问题很容易解释:
- 我有一个 table 具有开始日期和结束日期以及按“开始日期”排序的 n 行(请参见下图 - 黄色行是我想要在具有第一个开始日期的唯一行上的行和最后结束日期)
Table with rows where dates follow
- 当开始日期 n+1 == 结束日期 n 时,我想将日期重新组合在一行中。这是我需要的一个示例(下图)
Result i need
我尝试使用 for 循环来比较两个日期向量(从列中提取的向量),但它实际上不起作用...
我试过类似这样的方法来确定开始日期和结束日期:
'''
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 = 开始日期
datefin = 结束日期
感谢您的帮助,我愿意接受处理此问题的想法/方法。
这是一种使用 tidyverse
的方法。对于每个 Var1
组,根据开始日期不等于上一行结束日期的时间创建包含索引的子组(将这些行与同一索引保持在一起)。然后您可以 group_by
同时使用 Var1
和索引,并使用 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))
我的问题很容易解释:
- 我有一个 table 具有开始日期和结束日期以及按“开始日期”排序的 n 行(请参见下图 - 黄色行是我想要在具有第一个开始日期的唯一行上的行和最后结束日期)
Table with rows where dates follow
- 当开始日期 n+1 == 结束日期 n 时,我想将日期重新组合在一行中。这是我需要的一个示例(下图)
Result i need
我尝试使用 for 循环来比较两个日期向量(从列中提取的向量),但它实际上不起作用...
我试过类似这样的方法来确定开始日期和结束日期:
'''
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 = 开始日期 datefin = 结束日期
感谢您的帮助,我愿意接受处理此问题的想法/方法。
这是一种使用 tidyverse
的方法。对于每个 Var1
组,根据开始日期不等于上一行结束日期的时间创建包含索引的子组(将这些行与同一索引保持在一起)。然后您可以 group_by
同时使用 Var1
和索引,并使用 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))