Я пытаюсь классифицировать экземпляры в кадре данных по Holidays
или Normal
.
У меня есть даты, которые должны быть классифицированы как Holidays
в list/dataframe
объекте, и даты, которые я хочуклассифицировать в другом тестовом объекте.
Чтобы быть классифицированным как Holidays
, помимо того, что он находится между датами, которые должны быть классифицированы таким образом, в одном из столбцов list/daraframe
должно быть Condition
быть 1
вместо 0
(т. е. экземпляр с датой, которая фактически находится между Holidays
, следует пометить как Normal
тогда и только тогда, когда соответствующий Condition
равен 0
).
Объект, содержащий базу данных дней, которые должны быть помечены как Holidays
:
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")))
Мое рабочее решение для Bucle:
SlowWay
holidaysvector <- c()
for (ii in 1:nrow(mytestingdates)){
if (mytestingdates$Date[ii] %in% dfholidays$Date){
tmp <- which(dfholidays$Date == mytestingdates$Date[ii])
if (dfholidays$Condition[tmp] == 1) {
holidaysvector <- c(holidaysvector, "Holidays")
} else { holidaysvector <- c(holidaysvector, "Normal T.1") }
} else { holidaysvector <- c(holidaysvector, "Normal T.2") }
}
mytestingdates$forsolution <- holidaysvector
rm(tmp)
Но я бы хотел более эффективные решения.Я пробовал некоторые варианты R, но не смог:
R желаемое похожее решение:
mytestingdates$MyRtry <- ifelse(mytestingdates$Date %in% dfholidays$Date,
ifelse(dfholidays$Condition == 1, "Holiday", "Normal T.1"), "Normal T.2")
Желаемое решение
Date MyRtry forsolution
1 2014-01-07 Normal T.2 Normal T.2
2 2014-08-15 Holiday Holidays
3 2015-06-04 Holiday Holidays
4 2015-08-15 Holiday Normal T.1
Обратите внимание, что экземпляр№ 4 находится в Holidays
объекте, но его condition
равен 0, поэтому он помечен как Normal
день, это пропущено в моем решении R.
Любая идея?Любые советы по чистому коду или методам программирования, полученные из моего кода, будут очень оценены.