根据变量的长度分开

时间:2018-10-04 03:15:21

标签: r tidyverse tidyr

例如,我有一个时间数据。

time <- c(516, 715, 1625)

前516表示5:16

最后一个1625表示16:25。前1或2个数字表示小时,后2个数字表示分钟。

我想将它们分为几个小时和几分钟。如何根据变量的长度分离变量?

3 个答案:

答案 0 :(得分:4)

使用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}$)"将以下两个字符和最后两个字符为两位的点转换为两个部分。


或使用strsplit

的基本R替代
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)

答案 1 :(得分:2)

另一个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

答案 2 :(得分:2)

除字符串方法外,还将其转换为日期时间对象,并提取“小时”和“分钟”

v1 <- strptime(sprintf("%04d", time), format = "%H%M")
v1$hour
#[1]  5  7 16
v1$min
#[1] 16 15 25