Создание манекена на каждый час дня - PullRequest
1 голос
/ 02 октября 2019

Я удивлен, что не смог найти на этом сайте вопрос, который бы отвечал на мой.

Я хочу создать 24 фиктивных переменных для каждого часа дня (значение равно 1, если время - это час дня, и 0 - в противном случае). (Действительно) небольшая часть данных выглядит так:

       df <- as.POSIXct(c("08-01-2018 19:46", "08-01-2018 19:50", "08-01- 
       2018 20:46", "09-01-2018 21:17"), format = "%d-%m-%Y %H:%M")

       [1] "2018-01-08 19:46:00 CET" "2018-01-08 19:50:00 CET" "2018-01-08 
       20:46:00 CET" "2018-01-09 21:17:00 CET"

Я хочу, чтобы вывод был таким:

           19 20 21
        1:  1  0  0
        2:  1  0  0
        3:  0  1  0
        4:  0  0  1

Я уже посмотрел на этот вопрос: Создание фиктивной переменной для определенных часов дня

Единственная проблема, с которой я столкнулся при ответе на мою проблему, состоит в том, что мне нужно написать 24 оператора ifelse для каждого случая.

Мне было интересно, есть ли более элегантный способ получить этот вывод без необходимости писать 24 оператора ifelse.

Если этот вопрос дубликат, пожалуйста, дайте мне знать!

Заранее спасибо,

RC

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

Это нормально? Вы можете использовать as.data.frame на выходе, если вам это нужно как data.frame

library(lubridate)
hours <- as.factor(lubridate::hour(df))

# with intercept
model.matrix(~hours)

# without intercept - (+0)
model.matrix(~hours+0)

для дальнейшего чтения:

Генерация фиктивной переменной

https://stats.stackexchange.com/questions/174976/why-does-the-intercept-column-in-model-matrix-replace-the-first-factor

1 голос
/ 02 октября 2019

Эту проблему можно решить с помощью пакета lubridate.

Решение с использованием цикла for

hour() дает нам час POSIXctобъект. Создав вектор часов, представляющих интерес, и позволяя им пробегать указанные вами моменты времени, можно сделать следующее:

# hours, storage vector and list for building the dataframe
hourv <- c(19:21)
storage <- c()
list <- list()
# the loop over the desired hours and points in time 
for(k in 1:4){
for(i in 1:3){
  if(hourv[i] == hour(df[k])){
    storage[i] <- 1
  }
  else{
    storage[i] <- 0
  }
}
list[[k]] <- storage
}

Результат

df1 <- as.data.frame(do.call(rbind,list))

  V1 V2 V3
1  1  0  0
2  1  0  0
3  0  1  0
4  0  0  1

Данные

df <- as.POSIXct(c("08-01-2018 19:46", "08-01-2018 19:50", "08-01-2018 20:46", "09-01-2018 21:17"), format = "%d-%m-%Y %H:%M")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...