изменить дату, чтобы создать столбец за все время меньше метки времени - PullRequest
2 голосов
/ 28 мая 2020

У меня есть данные, которые выглядят примерно так:

# A tibble: 754 x 2
   time                 v1
   <dttm>              <dbl>
 1 2020-04-16 09:45:00  175.
 2 2020-04-16 10:00:00  174.
 3 2020-04-16 10:15:00  174.
 4 2020-04-16 10:30:00  173.
 5 2020-04-16 10:45:00  174.

Я хочу group_by переменную day из пакета lubridate и применить инструкцию ifelse.

df %>% 
  mutate(
    day = day(time)
    ) %>% 
  group_by(day) %>% 
  mutate(
    lessThanTenThirty = ifelse(time < "10:30", 1, 0)
  )

Таким образом, ожидаемый результат будет иметь 1 для всех time (для всех дней), когда данные меньше 10:30, и 0 для всех time после.

Данные:

    df <- structure(list(time = structure(c(1587030300, 1587031200, 1587032100, 
1587033000, 1587033900, 1587116700, 1587117600, 1587118500, 1587119400, 
1587120300), tzone = "UTC", class = c("POSIXct", "POSIXt")), 
    v1 = c(174.52, 174.25, 173.69, 173.07, 174.015, 179.578, 
    178.41, 178.42, 178.98, 178.6)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

вам не нужно группировать данные. Просто используйте format, чтобы переформатировать ваше время:

df %>% 
  mutate(lessThanTenThirty = if_else(format(time, '%H:%M') < "10:30", 1, 0))

# A tibble: 754 x 3
   time                   v1 lessThanTenThirty
   <dttm>              <dbl>             <dbl>
 1 2020-04-16 09:45:00  175.                 1
 2 2020-04-16 10:00:00  174.                 1
 3 2020-04-16 10:15:00  174.                 1
 4 2020-04-16 10:30:00  173.                 0
 5 2020-04-16 10:45:00  174.                 0
 6 2020-04-16 11:00:00  175.                 0
 7 2020-04-16 11:15:00  175.                 0
 8 2020-04-16 11:30:00  175.                 0
 9 2020-04-16 11:45:00  176.                 0
10 2020-04-16 12:00:00  176.                 0
1 голос
/ 28 мая 2020

Вариант с as.ITime

library(data.table)
library(dplyr)
df %>% 
   mutate(lessThanTenThirty = +(as.ITime(time) < as.ITime("10:30:00")))
...