#r
#r
Вопрос:
У меня есть список каждого дня с 2018-01-01
по 2018-06-01
. Это вектор, и он выглядит следующим образом:
dates <- c("2018-01-01", "2018-01-02", "2018-01-03", ... , "2018-05-30", "2018-06-01")
Я хочу создать фрейм данных, в котором в первом столбце указана каждая из этих дат, а во втором столбце указан их день недели. Я предполагаю, что 2018-01-01
сегодня понедельник.
date day
2018-01-01 Monday
2018-01-02 Tuesday
2018-01-03 Wednesday
... ...
2018-06-01 Monday
Я работаю над фреймом данных для достижения этой цели, но мне было любопытно найти лучший способ переработки по дням недели, чем решение, которое я собрал вместе.
day <- NULL
for (i in 1:length(dates)) {
x <- i
while (x > 7) {
x <- i - 7
}
day <- c(day, days[x])
}
cbind(dates,day)
Ответ №1:
Мы можем использовать weekdays
, чтобы получить день недели и поместить его во фрейм данных.
data.frame(dates, day = weekdays(dates))
# dates day
#1 2018-01-01 Monday
#2 2018-01-02 Tuesday
#3 2018-01-03 Wednesday
#4 2018-05-30 Wednesday
#5 2018-06-01 Friday
Редактировать
Если мы не хотим использовать какую-либо встроенную функцию, мы можем создать вектор дней и выполнить поиск оттуда. Учитывая, что первый день — «понедельник», мы можем использовать оператор modulo, чтобы найти соответствующий день для остальной части dates
days <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
day <- days[(as.numeric(dates - dates[1]) %% 7) 1]
day
#[1] "Monday" "Tuesday" "Wednesday" "Wednesday" "Friday"
а затем поместить их в dataframe
data.frame(dates, day)
# dates day
#1 2018-01-01 Monday
#2 2018-01-02 Tuesday
#3 2018-01-03 Wednesday
#4 2018-05-30 Wednesday
#5 2018-06-01 Friday
данные
dates<-as.Date(c("2018-01-01","2018-01-02","2018-01-03","2018-05-30","2018-06-01"))
Комментарии:
1. По причинам, связанным с проектом, мне не разрешено использовать какие-либо «волшебные функции»
2. Я ограничен только ‘dplyr’ и базовыми пакетами.
3. @Cauder Я обновил ответ. Я надеюсь, что это не попадает в вашу категорию «волшебной функции».
weekdays
является базовой функцией.4. Красиво, это идеально. Спасибо Ronak!
5. это называется оператором по модулю, он выдает остаток после деления. Попробуйте
12 %% 7
,12 %% 6
.