Расширение строк для включения промежуточных лет в диапазон дат - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть фрейм данных с диапазонами дат, из которого я хотел бы создать новые строки, представляющие каждый год, охватываемый этим диапазоном (включая начальный и конечный год). Это выглядит так:

id      start      end  
1      2000         2004  
2      2005         2005  
3      2005         2007  
4      2001         2002 

Где «id» - это фактор, «start» и «end» - даты.

Но мне нужно расширить фрейм данных, чтобы он выглядел так:

id      year        
1       2000 
1       2001
1       2002
1       2003 
1       2004
2       2005
3       2005
3       2006
3       2007
4       2001
4       2002

Я попробовал подходы, предложенные здесь: Расширение строк по диапазону дат с использованием начальной и конечной даты и здесь Создание строк между двумя датами в кадре данных . Конкретно я побежал:

library(data.table)
setDT(df)[, .(year = seq.Date(start, end, by = '1 year')), by = 'id']

А также попробовал подход dplyr:

library(dplyr)
library(purrr)
df_expanded <- df %>%
  transmute(id, year = map2(start, end, seq, by = "year")) %>%
  unnest %>% 
  distinct

Обе попытки привели к схожей ошибке:

Error in seq.int(r1$year, to0$year, by) : wrong sign in 'by' argument

Я посмотрел, но не могу понять, почему я получаю эту ошибку. Следует отметить, что эта ошибка также происходит с полными датами в формате ГГГГ-ММ-ДД. Меня не интересуют месячные или дневные различия, поэтому я переформатировал их только в формате YYYY, но этот код все еще возвращает сообщение об ошибке.

Может кто-нибудь помочь, пожалуйста?

1 Ответ

1 голос
/ 30 апреля 2019

образец данных

library(data.table)
DT <- fread("id      start      end  
1      2000         2004  
2      2005         2005  
3      2005         2007  
4      2001         2002")

код

year является числовым (а не датой), поэтому вы можете создать вектор от start до end с помощью id.

DT[, .(year = start:end), by = .(id)][]

выход

#     id year
#  1:  1 2000
#  2:  1 2001
#  3:  1 2002
#  4:  1 2003
#  5:  1 2004
#  6:  2 2005
#  7:  3 2005
#  8:  3 2006
#  9:  3 2007
# 10:  4 2001
# 11:  4 2002
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...