首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据变量的长度分开

根据变量的长度分开
EN

Stack Overflow用户
提问于 2018-10-04 03:15:21
回答 3查看 42关注 0票数 2

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

代码语言:javascript
运行
复制
time <- c(516, 715, 1625)

前516表示5:16。

最后一个1625年意味着16:25。前1或2个数字代表小时,而最后2个数字代表分钟。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-04 03:19:44

一个使用tidyverseseparate选项和一个积极的前瞻性模式

代码语言:javascript
运行
复制
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基替代方案

代码语言:javascript
运行
复制
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

样本数据

代码语言:javascript
运行
复制
df <- read.table(text =
    "time
516
715
1625
", header = T)
票数 4
EN

Stack Overflow用户

发布于 2018-10-04 03:25:41

另一个tidyverse选项:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-10-04 03:38:43

除了字符串方法之外,将其转换为date time对象并提取“hour”和“min”。

代码语言:javascript
运行
复制
v1 <- strptime(sprintf("%04d", time), format = "%H%M")
v1$hour
#[1]  5  7 16
v1$min
#[1] 16 15 25
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52638451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档