4

我正在尝试在我的数据集中为周末在 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
....          ....          ....

谢谢您的帮助

4

3 回答 3

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,这意味着我们不需要手头已有周末列表。

于 2013-06-05T17:14:12.593 回答
4
DF$IsWeekend <- DF$date %in% weekend

那么如果你真的更喜欢 0 和 1:

DF$IsWeekend <- as.numeric(DF$IsWeeekend)    
于 2013-06-05T17:04:22.780 回答
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 ))
于 2013-06-05T17:15:17.580 回答