2014-11-10 1 views
1

У меня есть кадр данных precip_range:Добавить строки в кадре данных на основе даты в предыдущей строке

start_date<-as.Date(c("2010-4-01", "2010-4-02", "2010-04-04", "2010-07-02", "2010-07-02", "2010-07-03")) 
end_date<-as.Date(c("2010-7-01", "2010-07-01", "2010-07-02", "2010-10-03", "2010-10-04", "2010-10-03")) 
date_category<-(c("A", "A", "A", "B", "B", "B")) 
site <-c("Site 1", "Site 2", "Site 3", "Site 1", "Site 2", "Site 3") 
precip_range<-data.frame(site, start_date, end_date, date_category) 
precip_range$days <-(end_date-start_date) 

Я хотел бы добавить столбец Date и добавить строки со значениями Date, которые заполняют пробелы даты между start_date и end_date от site. Все столбцы, кроме Date, должны сохранять ту же информацию, что и в precip_range. Я хочу, чтобы первые несколько строк результирующего кадра данных похожи на раму result_example данных:

date<-as.Date(c("2010-04-01", "2010-04-02", "2010-04-03", "2010-04-04", "2010-04-05", "2010-04-06")) 
result_date_category <-c("A", "A", "A", "A", "A", "A") 
result_site <-c("Site 1", "Site 1", "Site 1", "Site 1", "Site 1", "Site 1") 
result_start_date <-as.Date(c("2010-04-01", "2010-04-01", "2010-04-01", "2010-04-01", "2010-04-01","2010-04-01")) 
result_end_date <-as.Date(c("2010-07-01", "2010-07-01", "2010-07-01", "2010-07-01", "2010-07-01","2010-07-01")) 
result_example <-data.frame(date, result_site, result_start_date, result_end_date, result_date_category) 
result_example$days <-(result_end_date-result_start_date) 

Мой вопрос похож на [In R: Add rows with data of previous row to data frame, но я не в состоянии успешно адаптировать этот ответ для моего случая. Спасибо.

ответ

3

Попробуйте следующую

diffs <- with(precip_range, end_date - start_date + 1) 
result_site <- precip_range[rep(seq_len(nrow(precip_range)), diffs), ] 

library(data.table) 
setDT(result_site)[, Date := seq.int(start_date[1], end_date[1], by = "day"), 
        by = list(site, date_category)] 
result_site 

#  site start_date end_date date_category days  Date 
# 1: Site 1 2010-04-01 2010-07-01    A 91 days 2010-04-01 
# 2: Site 1 2010-04-01 2010-07-01    A 91 days 2010-04-02 
# 3: Site 1 2010-04-01 2010-07-01    A 91 days 2010-04-03 
# 4: Site 1 2010-04-01 2010-07-01    A 91 days 2010-04-04 
# 5: Site 1 2010-04-01 2010-07-01    A 91 days 2010-04-05 
# ---                
# 551: Site 3 2010-07-03 2010-10-03    B 92 days 2010-09-29 
# 552: Site 3 2010-07-03 2010-10-03    B 92 days 2010-09-30 
# 553: Site 3 2010-07-03 2010-10-03    B 92 days 2010-10-01 
# 554: Site 3 2010-07-03 2010-10-03    B 92 days 2010-10-02 
# 555: Site 3 2010-07-03 2010-10-03    B 92 days 2010-10-03 

Здесь мы рассчитали различия даты и выполняется строки индексации в соответствии с размером каждой разности. Впоследствии мы добавили различия по дате с использованием пакета data.table (для повышения производительности)

Смежные вопросы