Запись строковой переменной (например, «815») во временную переменную (08:15) в R - PullRequest
1 голос
/ 15 февраля 2020

Я ищу помощь в перекодировании строковой переменной, которая будет правильно отформатирована как переменная времени, используя r. У меня есть дневные данные для ~ 450 человек в течение недели. Они сами сообщали о времени своего сна и бодрствования, и я пытаюсь сделать 2 вещи с данными: 1) посмотреть, как меняется время сна и бодрствования в течение недели, и 2) рассчитать «продолжительность сна»; количество часов, которое проходит между этим временем сна и бодрствования.

Моя проблема в том, чтобы найти способ переформатировать данные. Время ожидания и пробуждения в настоящее время являются строковыми переменными без двоеточия между чч и мм («815» будет означать 8:15; «2345» будет означать 23:45; «15» будет означать 12:15). Мне не обязательно заботиться о том, чтобы туда попали AM / PM, хорошо, если все переформатируется в что-то вроде «23:45».

Я не могу понять, какой пакет / функция / творческое решение лучше всего поможет с этим. Я видел некоторые пакеты, такие как chron или lubridate, но эти функции кажутся более полезными для моей второй проблемы, вычисляя разницу во времени между двумя переменными. Но мне нужна помощь в перекодировании этой строковой переменной во что-то пригодное для использования.

Спасибо за любой совет или помощь !!!

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Мы можем заполнить 0, чтобы сделать ширину 4, а затем использовать as.ITime для преобразования в класс времени

library(stringr)
library(data.table)
out <- as.ITime(str_replace(str_pad("815", width = 4, pad = 0), "(\\d{2})", "\\1:"))
str(out)
#'ITime' int 08:15:00
out
#[1] "08:15:00"

Или используя base R

strptime(sub("(\\d{2})", "\\1:", sprintf("%04s", "815")), format = '%H:%M')
#[1] "2020-02-15 08:15:00 EST"
0 голосов
/ 15 февраля 2020

Предположим, у нас есть эти времена:

times <- c("345", "600", "1159", "1502", "2359")

Тогда мы можем определить простую функцию:

as_time <- function(t) gsub("(^\\d:)", "0\\1", gsub("(\\d{2}$)", ":\\1", t))

Итак, мы можем сделать

as_time(times)
#> [1] "03:45" "06:00" "11:59" "15:02" "23:59"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...