создание переменных индикатора, если время находится в определенных интервалах - PullRequest
0 голосов
/ 02 марта 2020

У меня есть столбец раз, который был введен как необработанный текст. Ниже приведен пример (код для ввода данных внизу поста):

#>   id    time
#> 1 NA    <NA>
#> 2  1 7:50 pm
#> 3  2 7:20 pm
#> 4  3 3:20 pm

Я хотел бы добавить переменные индикатора, которые, например, указывают, является ли время:

  • после 19:00
  • с 19:00 до 19:30

Итак, мой желаемый результат будет выглядеть так:

#>   id    time before_1930 between_1900_1930
#> 1 NA    <NA>          NA                NA
#> 2  1 7:50 pm           0                 0
#> 3  2 7:20 pm           1                 1
#> 4  3 3:20 pm           1                 0

Пока я пробовал читать во времена с parse_date_time, но это добавляет дату:

library(lubridate)
df <- df %>% mutate(time = lubridate::parse_date_time(time, '%I:%M %p'))
df
#>   id                time
#> 1 NA                <NA>
#> 2  1 0000-01-01 19:50:00
#> 3  2 0000-01-01 19:20:00
#> 4  3 0000-01-01 15:20:00

Есть ли простой способ работать напрямую с часами и минутами, а затем создавать фиктивные переменные, о которых я упоминал?

Код для ввода данных

df <- data.frame(
          id = c(NA, 1, 2, 3),
        time = c(NA, "7:50 pm", "7:20 pm", "3:20 pm")
)

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Попробуйте это:

library(dplyr)
library(lubridate)
data.frame(
   id = c(NA, 1, 2, 3),
   time = c(NA, "7:50 pm", "7:20 pm", "3:20 pm")
 ) %>% 
   mutate(real_time = lubridate::parse_date_time(time, '%I:%M %p'),
          is_before = case_when(
            hour(real_time) < 19  ~ "Before 19",
            hour(real_time) == 19 & minute(real_time) < 30 ~ "19:00 - 19:30",
            T ~ "After 19:30"
          ))
  id    time           real_time     is_before
1 NA    <NA>                <NA>   After 19:30
2  1 7:50 pm 0000-01-01 19:50:00   After 19:30
3  2 7:20 pm 0000-01-01 19:20:00 19:00 - 19:30
4  3 3:20 pm 0000-01-01 15:20:00     Before 19
1 голос
/ 02 марта 2020

Вместо того, чтобы пытаться работать с ним как с датой / временем, используйте вывод parse_date_time, чтобы рассчитать количество часов с полуночи на 0000-01-01.

df <- data.frame(
  id = c(NA, 1, 2, 3),
  time = c(NA, "7:50 pm", "7:20 pm", "3:20 pm")
)

library(dplyr)
library(lubridate)
df <- df %>% mutate(time = lubridate::parse_date_time(time, '%I:%M %p'), 
                    time = difftime(time, 
                                    as.POSIXct("0000-01-01", tz = "UTC"), 
                                    units = "hours"), 
                    before_1930 = as.numeric(time < 19.5),
                    between_1900_1930 = as.numeric(time > 19 & time < 19.5))
df
...