разделить по длине переменной - PullRequest
0 голосов
/ 04 октября 2018

Например, у меня есть данные времени.

time <- c(516, 715, 1625)

Первые 516 означают 5: 16

Последние 1625 означают 16:25.Первые 1 или 2 цифры представляют часы, а последние 2 цифры представляют минуты.

Я хочу разделить их на часы и минуты.Как отделить переменную по длине?

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Другой вариант tidyverse:

library(tidyverse)
df %>% mutate(hours   = str_sub(time, end = -3),
              minutes = str_sub(time, -2))

  time hours minutes
1  516     5      16
2  715     7      15
3 1625    16      25
0 голосов
/ 04 октября 2018

В дополнение к строковым методам преобразуйте его в объект даты и времени и извлеките «час» и «мин»

v1 <- strptime(sprintf("%04d", time), format = "%H%M")
v1$hour
#[1]  5  7 16
v1$min
#[1] 16 15 25
0 голосов
/ 04 октября 2018
Параметр

A tidyverse с использованием separate и положительным прогнозным шаблоном

library(tidyverse)
df %>% separate(time, c("hours", "minutes"), sep = "(?=\\d{2}$)")
#  hours minutes
#1     5      16
#2     7      15
#3    16      25

Объяснение: sep = "(?=\\d{2}$)" переводит отдельные записи в две части в точке, где следующие и последние два символадве цифры.


Или альтернатива Base R с использованием strsplit

t(sapply(strsplit(as.character(df$time), ""), function(x)
    as.numeric(rev(tapply(
        x,
        rev(rep(1:ceiling(length(x) / 2), each = 2, length.out = length(x))),
        FUN = function(x) paste0(x, collapse = ""))))))
#     [,1] [,2]
#[1,]    5   16
#[2,]    7   15
#[3,]   16   25

Пример данных

df <- read.table(text =
    "time
516
715
1625
", header = T)
...