1

我有在日历年开始和结束的时间序列数据,大多数填充函数(如 pad、padr 包)填充开始日期和结束日期之间的空白。但是我需要一个完整的年度记录。例如,如果我的数据开始日期是 2016 年 1 月 3 日,则所需的结果是将时间序列延长到年初,或者如果结束日期发生在之前,则延长到年底。NA 将用于填补空白。

一个适用于多个站点的数据的解决方案值得赞赏,因此下面的示例。

library(dplyr)
library(padr)

#Example datset

site<-"site_1"
date<-seq(as.Date('2016-01-03'),as.Date('2016-12-09'), by='day')
x <- runif(length(date),min=20,max=40)
df1<-data.frame(site,date,x)
df11<-df1[-c(2,3,4,5,6),]

site<-"site_2"
date<-seq(as.Date('2012-06-01'),as.Date('2012-10-25'), by='day')
x <- runif(length(date),min=30,max=40)
df2<-data.frame(site,date,x)
df22<-df2[-c(2,3,4,5,6),]

df<-rbind(df11,df22)

下面的尝试导致错误“开始值大于所有组的结束值”我认为问题在于它没有分组。

dfpad<-df%>%   
pad(group ='site',start_val=floor_date(df[1,2],unit="year"),
 end_val=(round_date(df[length(df$date),2], unit="year")-1))

期望的结果

dfgoal<- data.frame(date=seq(as.Date('2016-01-01'),as.Date('2016-01-10'), by='day'),
                x=c("NA","NA",21,"NA","NA","NA","NA","NA",20,22))
head(dfgoal,10)

4

1 回答 1

1

此解决方案使用 for 循环

原始数据

library(dplyr)
library(padr)
library(lubridate) 

#Example datset

site<-"site_1"
date<-seq(as.Date('2016-01-03'),as.Date('2016-12-09'), by='day')
x <- runif(length(date),min=20,max=40)
df1<-data.frame(site,date,x)
df11<-df1[-c(2,3,4,5,6),]

site<-"site_2"
date<-seq(as.Date('2012-06-01'),as.Date('2012-10-25'), by='day')
x <- runif(length(date),min=30,max=40)
df2<-data.frame(site,date,x)
df22<-df2[-c(2,3,4,5,6),]

df<-rbind(df11,df22)

解决方案

sites_a<-as.vector(unique(df$site))

contiga_df<-data.frame()

for(i in 1:2){
  
  site1a<-subset(df, site==sites_a[i])
  
  siteresult<-site1a%>%
    pad(start_val=floor_date(site1a[1,2],unit="year"), 
        end_val=(round_date(site1a[length(site1a$date),2], unit="year")-1))
  siteresult$site<- replace_na(siteresult$site,sites_a[i])
  contiga_df<-rbind(contiga_df, siteresult)
}
于 2021-11-01T14:43:27.017 回答