Сделайте условие, когда одна дата больше другой в R

#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. Спасибо, Казман! Это именно то, чего я хотел. 🙂