考虑下面的数据集,我想提出一个条件。我相信if
条件可以用,如果不能用,可以用另一种方法。
我想提出如下条件:
如果我选择的date2
大于date1
(date1
将始终只是一个日期,正如您可以在我的df datase
t中看到的那样),计算将如下: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
中的值,则根据要求给出原始数据集。