2017-04-24 57 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