我想我有一个非常简单的请求。我有下面的数据帧;地方;是唯一标识符,而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