[英]How to calculate end date R based on next start date, and reshaping the data into date count / time series?
[英]R Expand time series data based on start and end point
我想我有一個非常簡單的要求。 我有以下 dataframe,其中“place”是唯一標識符,而 start_date 和 end_date 可能重疊。 每個 ID“地點”的值都是唯一的。
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),其中一個觀察從一年開始,另一個觀察從那一年繼續。 在這種情況下,我更喜歡在該特定年份結束的“價值”。 因此,如果對 place=1 的一次觀察以 2007 年 3 月結束,而另一個 place=1 以 2007 年 4 月開始,那么如果有意義,則 place=1 的 year=2007 值將被標記為先前的“結束”值。
我只到此為止: library(data.table) data <- data.table(dat) data[, :=
(start_date = as.Date(start_date), end_date = as.Date(end_date))] data[ ,num_mons:= length(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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.