根据日期从一个数据帧输出各种子集

时间:2015-05-04 22:09:54

标签: r loops subset lubridate

我想根据从单独的数据帧定义的日期序列创建大量数据子集。例如,一个数据框将包含多年的日期和每日记录值。我在下面创建了一个假设的数据框。我想根据其他地方定义的开始和结束日期从此数据框中执行各种子集。

set.seed(24)
df1 <- as.data.frame(matrix(sample(0:3000, 300*10, replace=TRUE), ncol=1))
df2 <- as.data.frame(seq(as.Date("2004/1/1"), by = "day", length.out = 3000))
Example <- cbind(df1,df2)

开始日期和结束日期对应于特定样本之前1年的序列。因此,如果我在18/05/2006采样,我希望所有值都在17/05/2005 - 17/05/2006之间。我通过Lubridate包创建了一系列日期示例。

Sample_dates<- as.data.frame(dmy(c("18/05/2006","07/05/2010","01/04/2011",
         "26/10/2006","24/09/2010","27/09/2011")))
End_dates <- (Sample_dates)-days(1) 
Start_dates <- (End_dates)-years(1)
Sequence_dates <- cbind(Start_dates,End_dates)
colnames(Sequence_dates) <- c("Startdates", "Enddates")

随后,我应该根据第二个数据帧(Sequence_dates)中定义的日期序列,从原始数据帧(示例)中获得6个子集输出。实际上,存在多个样本日期,因此在一个编码部分中识别这些开始和结束日期的功能将优于手动选择每个开始和结束日期。我认为循环函数似乎很有可能,我根据其他地方发现的类似(更复杂)的帖子尝试了以下内容。 For() loop to ID dates that are between others and calculate a mean value

for (i in 1:nrow(Sequence_dates)){
Selected_dates[i] = is.between(Sequence_dates$Startdates[i], Discharge_dates$Enddates[i])
} 

然而,R不承认is.between和我欣赏代码可能马虎与我从来没有进行过循环。任何有关这方面的帮助将非常感谢!

詹姆斯

1 个答案:

答案 0 :(得分:0)

我可能会这样做。

由于开始日期仅为1年,因此只需要结束日期。

使用lapply()进行循环,迭代所有结束日期。

通过过滤两个日期之间的任何非零时差,主要通过difftime()完成子集。

set.seed(24)
df1 <- as.data.frame(matrix(sample(0:3000, 300*10, replace=TRUE), ncol=1))
df2 <- as.data.frame(seq(as.Date("2004/1/1"), by = "day", length.out = 3000))

df <- data.frame(df1, df2)
names(df) <- c("val", "date")

library(lubridate)
ends <- c(dmy(c("18/05/2006","07/05/2010","01/04/2011","26/10/2006","24/09/2010","27/09/2011"))) - days(1)

subs <- lapply(ends, function(x) {
    df[difftime(df$date, x - years(1)) >= 0 & difftime(df$date, x) <= 0, ]
})

length(subs)
# [1] 6
min(subs[[1]]$date)
# [1] "2005-05-17"
max(subs[[1]]$date)
# [1] "2006-05-17"