【发布时间】:2018-05-30 13:01:53
【问题描述】:
我正在尝试通过Holidays 或Normal 对数据框中的实例进行分类。
我有必须在list/dataframe 对象中归类为Holidays 的日期和我想在另一个测试对象中归类的日期。
要分类为Holidays,除了在必须以这种方式分类的日期之间之外,list/daraframe 列之一中的Condition 必须是1 而不是0(即,当且仅当对应的 Condition 是 0 时,日期实际上介于 Holidays 日期之间的实例应标记为 Normal。
对象包含应标记为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")))
我的工作解决方案是 for bucle:
慢路
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 解决方案中被遗漏了。
有什么想法吗?任何关于干净代码的建议或从我的代码派生的编程技术都将非常受欢迎。
【问题讨论】:
-
也许我在您的描述中遗漏了它,但是“V2”和“V3”列是什么?
-
对不起,如果不清楚,它们并不重要,你可以忽略它们,它们是原始数据集的一部分,但对于这种情况并不重要。