在Dataframe列中查找与R中的特定条件匹配的日期元素
我试图通过在Dataframe列中查找与R中的特定条件匹配的日期元素,r,date,dplyr,R,Date,Dplyr,我试图通过Holidays或Normal对数据帧中的实例进行分类 我在列表/dataframe对象中有必须分类为假日的日期,以及我想在另一个测试对象中分类的日期 要分类为假日,除了必须以这种方式分类的日期之间,在其中一个列表/daraframe列中有一个条件,该条件必须是1,而不是0(即,当且仅当相应的条件为0时,日期实际介于假日日期之间的实例应标记为正常) 对象,其中包含应标记为假日的天数数据库: holidays2015 <- list(list("2015-01-01",1,1,1)
Holidays
或Normal
对数据帧中的实例进行分类
我在列表/dataframe
对象中有必须分类为假日的日期,以及我想在另一个测试对象中分类的日期
要分类为假日
,除了必须以这种方式分类的日期之间,在其中一个列表/daraframe
列中有一个条件
,该条件必须是1
,而不是0
(即,当且仅当相应的条件
为0
时,日期实际介于假日
日期之间的实例应标记为正常
)
对象,其中包含应标记为假日的天数数据库:
holidays2015 <- list(list("2015-01-01",1,1,1),
list("2015-01-06",0,1,1),
list("2015-03-19",0,1,1),
list("2015-04-02",0,1,1),
list("2015-04-03",0,1,1),
list("2015-05-01",1,1,1),
list("2015-05-02",0,1,1),
list("2015-05-15",0,1,1),
list("2015-06-04",0,1,1),
list("2015-08-15",1,1,0),
list("2015-10-12",1,1,1),
list("2015-11-09",0,1,1),
list("2015-12-08",1,1,0),
list("2015-12-24",0,0,1),
list("2015-12-25",1,1,0),
list("2015-12-31",0,0,1))
holidays2014 <- list(list("2014-01-01",1,1,1),
list("2014-01-06",0,1,1),
list("2014-04-17",0,1,1),
list("2014-04-18",0,1,1),
list("2014-05-01",1,1,1),
list("2014-05-02",0,1,0),
list("2014-05-15",0,1,1),
list("2014-06-19",0,1,1),
list("2014-08-15",1,1,1),
list("2014-11-01",1,1,0),
list("2014-11-10",0,1,1),
list("2014-12-06",1,1,1),
list("2014-12-08",1,1,0),
list("2014-12-25",1,1,1))
totalholidays <- list(holidays2015, holidays2014)
dfholidays <- lapply(totalholidays, function(x) data.table::rbindlist(x))
dfholidays <- data.table::rbindlist(dfholidays)
names(dfholidays) <- c("Date", "V2", "V3", "Condition")
mytestingdates <- as.data.frame(list("Date" = c("2014-01-07", "2014-08-15",
"2015-06-04", "2015-08-15")))
请注意,实例4位于Holidays
对象中,但其条件
为0,因此它被标记为Normal
day,这在我的R解决方案中丢失
有什么想法吗?我将非常感谢您对我的代码中的干净代码或编程技术提出的任何建议。您愿意接受dplyr解决方案吗
library(dplyr)
mytestingdates %>%
left_join(dfholidays) %>%
mutate(forsolution = ifelse(is.na(Condition), "Normal T.2", ifelse(Condition == 0, "Normal T.1", "Holidays")))
在这里,dfholidays加入了mytestingdates。如果mytestingdates中的某个日期不在DfHolidates中,则只合并这些日期的NAs。因此,您可以检查条件是否为NA,如果为NA,则将forsolution设置为“Normal T.2”。随后,检查条件是否==0,如果为,则将forsolution设置为“Normal T.1”.在其他情况下,解决方案将是“假日”
更新:较短的将是:
mytestingdates %>%
left_join(dfholidays) %>%
mutate(forsolution = case_when(is.na(Condition) ~ "Normal T.2", Condition == 0 ~ "Normal T.1", TRUE ~ "Holidays"))
您是否接受dplyr解决方案
library(dplyr)
mytestingdates %>%
left_join(dfholidays) %>%
mutate(forsolution = ifelse(is.na(Condition), "Normal T.2", ifelse(Condition == 0, "Normal T.1", "Holidays")))
在这里,dfholidays加入了mytestingdates。如果mytestingdates中的某个日期不在DfHolidates中,则只合并这些日期的NAs。因此,您可以检查条件是否为NA,如果为NA,则将forsolution设置为“Normal T.2”。随后,检查条件是否==0,如果为,则将forsolution设置为“Normal T.1”.在其他情况下,解决方案将是“假日”
更新:较短的将是:
mytestingdates %>%
left_join(dfholidays) %>%
mutate(forsolution = case_when(is.na(Condition) ~ "Normal T.2", Condition == 0 ~ "Normal T.1", TRUE ~ "Holidays"))
此解决方案不区分NormalT1和NormalT2,但非常简单:
mytestingdates["classifier"] <- ifelse(mytestingdates$Date %in% dfholidays[dfholidays$Condition==1]$Date,"Holiday", "Normal")
mytestingdates
Date classifier
1 2014-01-07 Normal
2 2014-08-15 Holiday
3 2015-06-04 Holiday
4 2015-08-15 Normal
mytestingdates[“分类器”]此解决方案不区分NormalT1和NormalT2,但非常简单:
mytestingdates["classifier"] <- ifelse(mytestingdates$Date %in% dfholidays[dfholidays$Condition==1]$Date,"Holiday", "Normal")
mytestingdates
Date classifier
1 2014-01-07 Normal
2 2014-08-15 Holiday
3 2015-06-04 Holiday
4 2015-08-15 Normal
mytestingdates[“classifier”]也许我在您的描述中遗漏了它,但“V2”和“V3”列是什么?很抱歉,如果不清楚,它们并不重要,您可以忽略它们,它们是原始数据集的一部分,但对本例来说并不重要。也许我在您的描述中遗漏了它,但“V2”和“V3”列是什么?很抱歉,如果不清楚,它们并不重要,您可以忽略它们,它们是原始数据集的一部分,但对于本例来说并不重要。我不确定您是否需要区分NormalT1和NormalT2,或者您这样做是否是为了让事情变得更简单。我只是添加它们是为了阐明被归类为“正常”的原因但是不,两者之间没有实际的区别。非常感谢代码,我知道有一种超快速的方法可以找到它。我不确定你是否需要区分NormalT1和NormalT2,或者你这样做是否是为了让事情变得更简单。我只是添加了它们,以阐明被归类为“正常”的原因但是不,两者之间没有实际的区别。非常感谢代码,我知道会有一个超快速的方法,但我能找到它。感谢你的回答,它帮助我解决问题并学习其他编程思路。感谢你的回答,它帮助我解决问题并学习其他编程思维奈斯。
mytestingdates["classifier"] <- ifelse(mytestingdates$Date %in% dfholidays[dfholidays$Condition==1]$Date,"Holiday", "Normal")
mytestingdates
Date classifier
1 2014-01-07 Normal
2 2014-08-15 Holiday
3 2015-06-04 Holiday
4 2015-08-15 Normal