我有时间专栏,但是还没有被:或其他东西分隔开。看起来像这样:

  person      time
   1            356
   1            931
   1            2017
   1            2103
   2            256
   2            1031
   2            1517
   2            2206

如何分离它们?

最佳答案

解决问题有多种方法。选择哪种方法取决于所需的输出。

例如,您可以使用stringr::str_splittime分为小时和分钟的list向量,并使用正向预见

library(tidyverse)
df %>% mutate(time = str_split(time, "(?=\\d{2}$)"))
#  person   time
#1      1  3, 56
#2      1  9, 31
#3      1 20, 17
#4      1  2, 13
#5      2  2, 56
#6      2 10, 31
#7      2 15, 17
#8      2  2, 26

或者我们可以使用tidyr::separate创建两个新列hoursminutes
df %>% separate(time, c("hours", "minutes"), sep = "(?=\\d{2}$)")
#  person hours minutes
#1      1     3      56
#2      1     9      31
#3      1    20      17
#4      1     2      13
#5      2     2      56
#6      2    10      31
#7      2    15      17
#8      2     2      26

根据您的评论,您可以使用stringr::str_replace
df %>% mutate(time = str_replace(time, "(?=\\d{2}$)", ":"))
#  person  time
#1      1  3:56
#2      1  9:31
#3      1 20:17
#4      1  2:13
#5      2  2:56
#6      2 10:31
#7      2 15:17
#8      2  2:26

和使用sub的基本R相同
transform(df, time = sub("(?=\\d{2}$)", ":", time, perl = TRUE))

给出相同的结果。

样本数据
df <- read.table(text = "
person      time
  1            356
  1            931
  1            2017
  1            213
  2            256
  2            1031
  2            1517
  2            226", header = T)

07-24 09:51