创建一个周末虚拟变量

时间:2013-06-05 17:03:05

标签: r

我正在尝试在R中的数据集中创建一个虚拟变量用于周末,即当一天在周末期间列的值为1,当一天在一周期间时值为0。

我首先尝试逐行遍历整个数据集,如果日期是周末,则将周末变量指定为1。但这需要永远考虑到有大约70,000行,我知道有一个更简单的方法,我只是想不出来。

以下是我想要的数据帧。现在它看起来像周末专栏除外。我不知道这是否会改变,但现在日期是一个因素。我还列出了周末的日期:

weekend <- c("2/9/2013", "2/10/2013", "2/16/2013", "2/17/2013", ... , "3/2/2013")

date          hour          weekend
2/10/2013     0             1
2/11/2013     1             0
....          ....          ....

感谢您的帮助

3 个答案:

答案 0 :(得分:5)

依靠实际围绕日期构建的数据结构和函数可能更安全:

dat <- read.table(text = "date          hour          weekend
+ 2/10/2013     0             1
+ 2/11/2013     1             0",header = TRUE,sep = "")
> weekdays(as.Date(as.character(dat$date),"%m/%d/%Y")) %in% c('Sunday','Saturday')
[1]  TRUE FALSE

这与SenorO的答案基本相同,但我们将日期转换为实际日期列,然后简单地使用weekdays,这意味着我们不需要手头有周末列表。

答案 1 :(得分:4)

DF$IsWeekend <- DF$date %in% weekend

然后,如果你真的喜欢0和1:

DF$IsWeekend <- as.numeric(DF$IsWeeekend)    

答案 2 :(得分:1)

我会检查我的日期是否真的是周末日期。

weekends <- c("2/9/2013", "2/10/2013", "2/16/2013", "2/17/2013","3/2/2013")
weekends = weekends[ as.POSIXlt(as.Date(weekends,'%m/%d/%Y'))$wday %in% c(0,6)]

然后使用trsanformifelse创建新列

transform(dat ,weekend = ifelse(date %in% as.Date(weekends,'%m/%d/%Y') ,1,0 ))