我有对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
我觉得这已经问过,但无法找到的时刻相关的职位。
总之,要回答你的问题,我们可以使用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
使用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