#r
Вопрос:
Я хотел бы поставить условие, учитывая приведенный ниже набор данных. Я считаю, что это if
условие можно использовать, если нет, то это может быть другой способ.
Я хотел бы поставить следующее условие:
Если мой выбранный date2
больше date1
( date1
всегда будет только одна дата, как вы можете видеть в моем df datase
t), расчет будет следующим: дата 2 — дата 1 1 = X -> этот X будет количеством столбцов DR, которые будут удалены из моего > df dataset
.
Я представлю свой код 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), мы получим следующее:
дата 2 — дата 1 1 = X
01/07 — 28/06 1 = 3 1 = 4
Это 4 означает , что первые 4 столбца DR будут удалены из my 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), мы получим следующее:
дата 2 — дата 1 1 = X
02/07 — 28/06 1 = 4 1 = 5
Это 5 означает , что первые 5 столбцов DR будут удалены из my 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
Я попытался вставить пример, чтобы было более понятно.
Любая помощь приветствуется!
Большое спасибо!
Ответ №1:
Если я правильно понял ваш вопрос, вы можете сначала преобразовать столбцы даты в формат даты с 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
функцию. При этом используется filter()
функция dplyr
пакета.
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
соответствии с требованием.
Комментарии:
1. @ JSouza Ответил здесь вместо другой темы.
2. Спасибо, Казман! Это именно то, чего я хотел. 🙂