2017-10-25 4 views
1

私は(それが間隔型の列に選択したSQLの結果であった)のような文字ベクトルを持っている:SQL間隔を文字列としてlubridate期間に変換するにはどうすればよいですか?

[1] "00:01:13"  "00:00:33"  "00:08:23"  "00:00:13"  "5 days 22:07:16" "00:01:04"  "00:00:14"  "00:05:22"  
[9] "00:04:01"  "00:02:39"  "00:04:24"  "00:05:45"  "3 days 22:38:11" "00:05:50"  "00:03:22"  "00:00:34"  
[17] "00:03:35"  "00:02:09"  "00:01:28"  "00:06:06"  "00:03:37"  "00:00:08"  

私はlubridate期間オブジェクトに変換する必要があります。もしそこに日がなければ、私はhms()の機能を使ってそれをすることができます。ベクターの中に日があるときはどうしたらいいですか?

+1

「サブ」を使って「曜日」を削除することもできます。 'sub("^\\ d + days "、" "、myVec)'のようなものです。 – lmo

+0

私はそのようなすべての文字列を期間に変換する機能を探していますし、 'days'部分も適切に含めることができます。 rubridateや他のパッケージに何もない場合は、自分で何かを実装する必要があります。 –

答えて

1

私のソリューションは少し関わっています。私は速い答えは、lubridateでこれを行う方法があると思う。しかし、文字列を適切な形式にするには、いくつかの作業が必要です。その考え方は、正規表現stringr()を使用して情報を使用可能な形式に変換してから、データをperiod形式に変換することです。

test <-c("00:01:13","00:00:33","00:08:23","00:00:13", 
     "5 days 22:07:16", "00:01:04","00:00:14","00:05:22") 
test_df <- data.frame(time = test) 

最初のものを用いることができる形式にデータを再フォーマットすることです:

test_df <- test_df %>% 
mutate(time = stringr::str_replace_all(time, ':', ' ')) %>% 
mutate(time = stringr::str_replace(time, '\\sdays', '')) %>% 
mutate(time = ifelse(nchar(time) < 10, paste('0', time), time)) %>% 
separate(time, c('day', 'hour', 'minute', 'second')))) 

私たちは、その後、paste()が戻って一緒に、との良好なフォーマットにデータを取得するためにhms()lubridateを使用することができます。

test_df <- test_df %>% 
mutate(time = paste(hour, minute, second)) %>% 
mutate(time = hms(time)) %>% 
mutate(time = time + days(day)) 

これは必要性を満たしていますか?

関連する問題