Как мне переработать символьный вектор в R?

#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 .