簡體   English   中英

R 根據起點和終點展開時間序列數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM