在基准数据帧查找观察日,两个日期之间,和用于R中的所有观测报告另一个参考值

问题描述 投票:1回答:2

我有对C观察相关的日期。 2000和观察,并想一个新的因素加入到我的观察数据“季节”。每日期落在一个赛季内,由开始日期和结束日期的约束。我有季节,在一个小参考数据帧开始日期和结束日期,并想查找的观测日期,并推断它所属,由开始和结束日期它落在之间哪个季节。

我试过的范围内和间隔功能的各种组合,但不能让它报到赛季价值。

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
r
2个回答
1
投票

我觉得这已经问过,但无法找到的时刻相关的职位。

总之,要回答你的问题,我们可以使用sapply和检查每个DateStartEndReference.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

这是假设,我们将有独特的StartEnd日期为每个赛季将不会有重叠。如果有重叠,我们可以使用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

0
投票

使用dplyrmagrittr,它并没有太多的时间节省您作为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
© www.soinside.com 2019 - 2024. All rights reserved.