例如,我有一个时间数据。
time <- c(516, 715, 1625)前516表示5:16。
最后一个1625年意味着16:25。前1或2个数字代表小时,而最后2个数字代表分钟。
我想把它们分成几个小时和几分钟。如何根据变量的长度来分离变量?
发布于 2018-10-04 03:19:44
一个使用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)发布于 2018-10-04 03:25:41
另一个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发布于 2018-10-04 03:38:43
除了字符串方法之外,将其转换为date time对象并提取“hour”和“min”。
v1 <- strptime(sprintf("%04d", time), format = "%H%M")
v1$hour
#[1] 5 7 16
v1$min
#[1] 16 15 25https://stackoverflow.com/questions/52638451
复制相似问题