2013-06-05 3 views
4

Я пытаюсь создать фиктивную переменную в своем наборе данных в R в выходные дни, т.е. столбец имеет значение 1, когда день находится в выходные дни и значение 0, когда день находится во время неделю.Создание переменной dummy для выходных

Сначала я попытался выполнить итерацию по всему набору данных по строке и присвоить переменную выходного дня 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

R имеет встроенные знания будням и в выходные дни. Вам не нужно хранить вектор строк в выходные дни. Например, 'transform (DF, weekend = as.POSIXlt (date, format = '% m /% d /% Y') $ wday% in% c (0, 6))' –

ответ

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

Тогда, если вы действительно предпочитаете 0s и 1s:

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

спасибо! простое решение – Ford

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, что означает, что нам не нужно иметь список выходных уже под рукой.

+0

+1! для обновления до ответа в следующий раз! – agstudy

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)] 

Затем с помощью trsanform и ifelse создать новый столбец

transform(dat ,weekend = ifelse(date %in% as.Date(weekends,'%m/%d/%Y') ,1,0)) 
Смежные вопросы