R根据起点和终点展开时间序列数据



我想我有一个非常简单的请求。我有下面的数据帧;地方;是唯一标识符,而start_date和end_date可能重叠。这些值对于每个ID"0"是唯一的;地方";。

place  start_date   end_date value
1     2007-09-01  2010-10-12  0.5
2     2013-09-27  2015-10-11  0.7
...

我需要的是创建一个基于年份的变量,其中我每年扩展时间序列(从1月1日开始(即2011-01-01(,为特定的"日期"开始一个新行;地方;以及";值";。我的意思是:

place  year  value 
1     2007    0.5   
1     2008    0.5   
1     2009    0.5   
1     2010    0.5   
2     2013    0.7    
2     2014    0.7    
2     2015    0.7    
...

对于两个独立的案例,存在一些重叠的案例(即"地点"=1&"年份"=2007(,其中一个观察从一年开始,另一个观察则从该年开始。在这种情况下,我更喜欢";值";在特定年份结束。因此,如果位置=1的一个观测值在3月以2007结束,而另一个位置=1的观测值在4月以2007开始;结束";如果有意义的话。

我只走了这么远:库(data.table(数据<-data.table(dat(data[,:=(start_date=as.date(start_date(,end_date=as.date(end_date((]data[,num_mons:=长度(seq(from=start_date,to=end_date,by='year'((,by=1:nrow(data(]

我想写一个循环最有意义?

谢谢你的帮助和建议。

使用tidyverse解决方案可能看起来像:

library(dplyr)
library(stringr)
library(purrr)
library(tidyr)
data <- tibble(place = c(1, 2),
start_date = c('2007-09-01',
'2013-09-27'),
end_date = c('2010-10-12',
'2015-10-11'),
value = c(0.5, 0.7))
data %>%
mutate(year = map2(start_date,
end_date,
~ as.character(str_extract(.x, '\d{4}'): 
str_extract(.y, '\d{4}')))) %>%
separate_rows(year) %>%
filter(!year %in% c('c', '')) %>%
select(place, year, value)
#   place year  value
#   <dbl> <chr> <dbl>
# 1     1 2007    0.5
# 2     1 2008    0.5
# 3     1 2009    0.5
# 4     1 2010    0.5
# 5     2 2013    0.7
# 6     2 2014    0.7
# 7     2 2015    0.7

我很难理解你问题的第三段("有……"(。在我看来,这是一个单独的问题。如果是这样的话,请考虑将问题转移到SO上的另一个位置。如果不是单独的问题,请重新表述该段。

您可以执行以下操作:

library(lubridate)
library(tidyverse)
df %>%
group_by(place) %>%
mutate(year = list(seq(year(ymd(start_date)), year(ymd(end_date)))))%>%
unnest(year)%>%
select(place,year,value)
# A tibble: 7 x 3
# Groups:   place [2]
place  year value
<int> <int> <dbl>
1     1  2007   0.5
2     1  2008   0.5
3     1  2009   0.5
4     1  2010   0.5
5     2  2013   0.7
6     2  2014   0.7
7     2  2015   0.7

最新更新