2017-04-24 56 views
3

我有两列时间信息在data.frame中使用分钟和秒,没有附加的日期信息,现在我想计算这两列之间的差异,并获得diff_time(end_time-start_time)的新列秒(diff_time1)或以原始变量(diff_time2)表示的分钟和秒数,我如何在R中计算这个值? 例如:如何获得分秒的时差?

 start_time end_time diff_time1 diff_time2 
     12'10"  16'23"  4'13"  253 
     1'05"  76'20"  75'15"  4515 
     96'10"  120'22"  24'12"  1452 
+0

'start_time'和'end_time'当前存储为字符串吗? –

+0

是的,它是字符串。 – johnsonzhj

回答

6

假设你的时间被存储为字符串,在这种情况下,报价表示秒钟必须进行转义:

times <- data.frame(start_time = c("12'10\"", "1'05\"", "96'10\""), 
        end_time = c("16'23\"", "76'20\"", "120'22\"") 
        ) 

然后你可以使用lubridate::ms转换为分+秒,做计算。你需要做一些额外的文本转换,如果你想要的结果diff_time1作为字符串:

library(lubridate) 
library(dplyr) 

times %>% 
    mutate(diff_time1 = ms(end_time) - ms(start_time)) %>% 
    mutate(diff_time2 = as.numeric(diff_time1)) %>% 
    mutate(diff_time1 = gsub("M ", "'", diff_time1)) %>% 
    mutate(diff_time1 = gsub("S", "\"", diff_time1)) 

    start_time end_time diff_time1 diff_time2 
1  12'10" 16'23"  4'13"  253 
2  1'05" 76'20"  75'15"  4515 
3  96'10" 120'22"  24'12"  1452 
0

您可以存储分开分钟和秒,并将它们存储为difftime对象,它可以相加和相减:

library(tidyverse) 

df <- structure(list(start_time = c("12'10\"", "1'05\"", "96'10\""), 
    end_time = c("16'23\"", "76'20\"", "120'22\"")), class = "data.frame", row.names = c(NA, 
-3L), .Names = c("start_time", "end_time")) 

df %>% 
    separate(start_time, c('start_min', 'start_sec'), convert = TRUE, extra = 'drop') %>% 
    separate(end_time, c('end_min', 'end_sec'), convert = TRUE, extra = 'drop') %>% 
    mutate(start = as.difftime(start_min, units = 'mins') + as.difftime(start_sec, units = 'secs'), 
      end = as.difftime(end_min, units = 'mins') + as.difftime(end_sec, units = 'secs'), 
      diff_time = end - start) 

#> start_min start_sec end_min end_sec  start  end diff_time 
#> 1  12  10  16  23 730 secs 983 secs 253 secs 
#> 2   1   5  76  20 65 secs 4580 secs 4515 secs 
#> 3  96  10  120  22 5770 secs 7222 secs 1452 secs