Посмотрите дату наблюдения между двумя датами во фрейме базовых данных и сообщите другое контрольное значение для всех наблюдений в R - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть даты, связанные с наблюдениями за c.2000 наблюдений, и я хотел бы добавить новый фактор к моим данным наблюдений «сезон».Каждая дата попадает в сезон, связанный с начальной и конечной датой.У меня есть сезон, дата начала и дата окончания в небольшом фрейме справочных данных, и я хотел бы посмотреть дату наблюдения и определить, к какому сезону он относится, к каким датам начала и окончания он находится между.

I 'Мы пробовали различные комбинации функции в пределах и интервала, но не можем заставить ее сообщить значение сезона.

https://rdrr.io/cran/lubridate/man/within-interval.html

Подобные вопросы были заданы при обмене стека, но недостаточно четко сформулированы дляПрименимый ответ, который мне поможет.

Мои справочные данные таковы:

Season <- c("A","B","C","D","E","F","G","H","I","J","K")
Start <- c("29-Apr-12","19-Oct-12",
           "29-Apr-13","19-Oct-13",
           "29-Apr-14","19-Oct-14",
           "29-Apr-15","19-Oct-15",
           "29-Apr-16","19-Oct-16",
           "29-Apr-17")
Start <- as.Date (Start,"%d-%b-%y")
End <-  c("18-Oct-12","28-Apr-13",
          "18-Oct-13","28-Apr-14",
          "18-Oct-14","28-Apr-15",
          "18-Oct-15","28-Apr-16",
          "18-Oct-16","28-Apr-17",
          "18-Oct-17")
End <- as.Date (End,"%d-%b-%y")
Reference.df <- data.frame(Season,Start,End)
> Reference.df
  Season      Start        End
       A 2012-04-29 2012-04-29
       B 2012-10-19 2012-10-19
       C 2013-04-29 2013-04-29
       D 2013-10-19 2013-10-19
       E 2014-04-29 2014-04-29
       F 2014-10-19 2014-10-19
       G 2015-04-29 2015-04-29
       H 2015-10-19 2015-10-19
       I 2016-04-29 2016-04-29
       J 2016-10-19 2016-10-19
       K 2017-04-29 2017-04-29

А мои данные наблюдений таковы:

 Date <-  c("25-Apr-14","03-May-14","24-Nov-15","16-Feb-14","02-May-14","21- 
 Apr-17","27-Apr-15","27-Apr-13", "12-Aug-16","16-Apr-14")
 Date <- as.Date (Date,"%d-%b-%y")
 Observation <- seq(1,10)
 Data.df <- data.frame(Observation,Date)
> Data.df
  Observation       Date
            1 2014-04-25
            2 2014-05-03
            3 2015-11-24
            4 2014-02-16
            5 2014-05-02
            6 2017-04-21
            7 2015-04-27
            8 2013-04-27
            9 2016-08-12
           10 2014-04-16

Мойжелаемый результат выглядит следующим образом:

> Data.df
      Observation       Date Season
                1 2014-04-25      D
                2 2014-05-03      E
                3 2015-11-24      H
                4 2014-02-16      D
                5 2014-05-02      E
                6 2017-04-21      J
                7 2015-04-27      F
                8 2013-04-27      B
                9 2016-08-12      I
               10 2014-04-16      D

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Используя dplyr и magrittr, это не сэкономит вам столько времени, сколько sapply, но это будет немного проще, если вы поделитесь этим с коллегами, не столь опытными:

library(dplyr)
library(magrittr)

Data.df <- Data.df %>% mutate(Season = case_when(Date > as.Date("2012-04-29") & Date < as.Date("2012-10-18")~"A",
                                                 Date > as.Date("2012-10-19") & Date < as.Date("2013-04-28")~"B",
                                                 Date > as.Date("2013-04-29") & Date < as.Date("2013-10-18")~"C",
                                                 Date > as.Date("2013-10-19") & Date < as.Date("2014-04-28")~"D",
                                                 Date > as.Date("2014-04-29") & Date < as.Date("2014-10-18")~"E",
                                                 Date > as.Date("2014-10-19") & Date < as.Date("2015-04-28")~"F",
                                                 Date > as.Date("2015-04-29") & Date < as.Date("2015-10-18")~"G",
                                                 Date > as.Date("2015-10-19") & Date < as.Date("2016-04-28")~"H",
                                                 Date > as.Date("2016-04-29") & Date < as.Date("2016-10-18")~"I",
                                                 Date > as.Date("2016-10-19") & Date < as.Date("2017-04-28")~"J",
                                                 Date > as.Date("2017-04-29") & Date < as.Date("2017-10-18")~"K"))
Data.df

#Observation     Date        Season
#1             2014-04-25      D
#2             2014-05-03      E
#3             2015-11-24      H
#4             2014-02-16      D
#5             2014-05-02      E
#6             2017-04-21      J
#7             2015-04-27      F
#8             2013-04-27      B
#9             2016-08-12      I
#10            2014-04-16      D
0 голосов
/ 06 февраля 2019

Я думаю, что об этом уже спрашивали, но в данный момент не могу найти соответствующую запись

В любом случае, чтобы ответить на ваш вопрос, мы можем использовать sapply и проверить, где каждая Date находится между Start и End датой в Reference.df, и извлечь соответствующую Season.

Data.df$Season <- sapply(Data.df$Date, function(x) 
        Reference.df$Season[x >= Reference.df$Start & x <= Reference.df$End])


Data.df
#   Observation       Date Season
#1            1 2014-04-25      D
#2            2 2014-05-03      E
#3            3 2015-11-24      H
#4            4 2014-02-16      D
#5            5 2014-05-02      E
#6            6 2017-04-21      J
#7            7 2015-04-27      F
#8            8 2013-04-27      B
#9            9 2016-08-12      I
#10          10 2014-04-16      D

Предполагается, что у нас будет уникальная дата Start и End для каждого сезона, и совпадений не будет.Если есть совпадение, мы могли бы использовать which.max, чтобы получить первое Season, где оно находится между ними.

sapply(Data.df$Date, function(x) 
  Reference.df$Season[which.max(x >= Reference.df$Start & x <= Reference.df$End)])

Или лучший вариант, используя cut, предполагая, что Seasonsнепрерывно один за другим

cut(as.numeric(Data.df$Date), 
 breaks = c(-Inf, Reference.df$Start[-1], Inf), labels =  Reference.df$Season)

#[1] D E H D E J F B I D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...