创建r中一个日期大于另一个日期的条件



考虑下面的数据集,我想提出一个条件。我相信if条件可以用,如果不能用,可以用另一种方法。

我想提出如下条件:

如果我选择的date2大于date1(date1将始终只是一个日期,正如您可以在我的df dataset中看到的那样),计算将如下:date2 - date1 + 1 = X ->这个X将是从我的df dataset中删除的DR列的数量。

我将展示我的df dataset的代码,然后是一个示例供您查看。

df <- structure(
list(date1 = c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28",
"2021-06-28","2021-06-28","2021-06-28"),
date2 = c("2021-04-02","2021-04-03","2021-04-08","2021-04-09","2021-04-10","2021-07-01","2021-07-02","2021-07-03"),
Week= c("Friday","Saturday","Thursday","Friday","Saturday","Thursday","Friday","Monday"),
DR01_PV = c(4,1,4,3,3,4,3,6), DR02_PV= c(4,2,6,7,3,2,7,4),DR03_PV = c(9,5,4,3,3,2,1,5),
DR04_PV = c(5,4,3,3,6,2,1,9),DR05_PV = c(5,4,5,3,6,2,1,9),
DR06_PV = c(2,4,3,3,5,6,7,8),DR07_PV = c(2,5,4,4,9,4,7,8)),
class = "data.frame", row.names = c(NA, -8L))
df
date1      date2       Week      DR01_PV DR02_PV DR03_PV DR04_PV DR05_PV DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       4       4       9       5       5       2       2
2 2021-06-28 2021-04-03 Saturday       1       2       5       4       4       4       5
3 2021-06-28 2021-04-08 Thursday       4       6       4       3       5       3       4
4 2021-06-28 2021-04-09   Friday       3       7       3       3       3       3       4
5 2021-06-28 2021-04-10 Saturday       3       3       3       6       6       5       9
6 2021-06-28 2021-07-01 Thursday       4       2       2       2       2       6       4
7 2021-06-28 2021-07-02   Friday       3       7       1       1       1       7       7
8 2021-06-28 2021-07-03   Monday       6       4       5       9       9       8       8

例子:

如果我选择01/07 (date2),这是一个大于date1(28/06)的日期,我们有以下内容:

date2 - date1 + 1 = X

+ 1 = 3 + 1 = 4

这4意味着前4列DR将从我的df dataset中删除,即DR01_PV, DR02_PV, DR03_PV和DR04_PV。我的新数据集(df1)将是:

df1
date1      date2     Week DR05_PV DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       5       2       2
2 2021-06-28 2021-04-03 Saturday       4       4       5
3 2021-06-28 2021-04-08 Thursday       5       3       4
4 2021-06-28 2021-04-09   Friday       3       3       4
5 2021-06-28 2021-04-10 Saturday       6       5       9
6 2021-06-28 2021-07-01 Thursday       2       6       4
7 2021-06-28 2021-07-02   Friday       1       7       7
8 2021-06-28 2021-07-03   Monday       9       8       8

如果我选择02/07 (date2),这是一个大于date1(28/06)的日期,我们有以下内容:

date2 - date1 + 1 = X

02/07 - 28/06 + 1 = 4 + 1 = 5

这5意味着前5列DR将从我的df dataset中删除,即DR01_PV, DR02_PV, DR03_PV, DR04_PV和DR05_PV。我的新数据集(df2)将是:

df2
date1      date2     Week DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       2       2
2 2021-06-28 2021-04-03 Saturday       4       5
3 2021-06-28 2021-04-08 Thursday       3       4
4 2021-06-28 2021-04-09   Friday       3       4
5 2021-06-28 2021-04-10 Saturday       5       9
6 2021-06-28 2021-07-01 Thursday       6       4
7 2021-06-28 2021-07-02   Friday       7       7
8 2021-06-28 2021-07-03   Monday       8       8

我试着插入一个例子以便更容易理解。

欢迎大家的帮助!

非常感谢!

如果我正确理解您的问题,您可以首先使用lubridate库将日期列转换为日期格式。

library(lubridate)
df[, 1:2] = lapply(df[, 1:2], FUN = as_date)

然后是一个辅助函数来计算你所需要的值。

get_cutoff = function(date) {
date2 = as_date(date)
date1 = df[1,1]
as.numeric(date2 - date1 + 1)
}

我假设您想要重复这个过程,所以我编写了一个函数来删除适当的列。参数start_index是它应该开始删除的任何列,因为它似乎不是第一列。如果日期恰好大于date1列中的第一个观测值,则返回原始数据帧。

subset_data = function(date, start_index) {
if (as_date(date) > df[1,1]) {
end_index = start_index + get_cutoff(date) - 1
return(df[, -c(start_index:end_index)])
} else {
return(df)
}
} 

你需要注意你给出的日期的格式,但是要用"2021-07-02"(并且起始列索引为4),这给出:

subset_data("2021-07-02", 4)
date1      date2     Week DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       2       2
2 2021-06-28 2021-04-03 Saturday       4       5
3 2021-06-28 2021-04-08 Thursday       3       4
4 2021-06-28 2021-04-09   Friday       3       4
5 2021-06-28 2021-04-10 Saturday       5       9
6 2021-06-28 2021-07-01 Thursday       6       4
7 2021-06-28 2021-07-02   Friday       7       7
8 2021-06-28 2021-07-03   Monday       8       8

和日期"2021-07-01";给:

subset_data("2021-07-02", 4)
date1      date2     Week DR05_PV DR06_PV DR07_PV
1 2021-06-28 2021-04-02   Friday       5       2       2
2 2021-06-28 2021-04-03 Saturday       4       4       5
3 2021-06-28 2021-04-08 Thursday       5       3       4
4 2021-06-28 2021-04-09   Friday       3       3       4
5 2021-06-28 2021-04-10 Saturday       6       5       9
6 2021-06-28 2021-07-01 Thursday       2       6       4
7 2021-06-28 2021-07-02   Friday       1       7       7
8 2021-06-28 2021-07-03   Monday       9       8       8
然后可以对函数进行适当修改,以最适合您的情况。

编辑:如果您还希望根据输入日期过滤数据的行,而不仅仅是列,您可以修改subset_data函数。使用dplyr包中的filter()功能。

subset_data = function(date, start_index) {
date = as_date(date)
if (date > df[1,1]) {
end_index = start_index + get_cutoff(date) - 1
df[, -c(start_index:end_index)] %>%
filter(date2 == date)
} else {
return(df)
}
} 

给了:

> subset_data("2021-07-02", 4)
date1      date2   Week DR06_PV DR07_PV
1 2021-06-28 2021-07-02 Friday       7       7

但是如果该值小于date1中的值,则根据要求给出原始数据集。

相关内容

  • 没有找到相关文章