2017-03-20 18 views
1

時間の経過とともに人物ごとにパフォーマンスデータが得られます。これは因子としてRにインポートされます。例は次のとおりです。変換h:分:秒:ミリ秒から分:秒の秒数R

head(df, 4) 
    TimeStart  TimeFinish ID     
1 0:00:00:08 0:00:12:06 1   
2 0:05:35:02 0:05:55:05 1  
3 0:13:33:01 0:13:53:03 2  
4 0:19:26:02 0:19:46:08 2 

> sapply(df, class) 
    TimeStart TimeFinish  ID  
"factor" "factor" "factor"  

私はminutes.seconds形式で数値としてTimeStartTimeFinishを持つことを望みます。ミリ秒の精度は必要ありません。時間も必要ありません。私はプロットのための数値形式のデータが欲しいです。私の希望する出力は次のようになります。

head(df, 4) 
    TimeStart  TimeFinish ID     
1 0.0   0.12   1   
2 5.35   5.55   1  
3 13.33   13.53   2  
4 19.26   19.46   2 

ご協力いただければ幸いです。ありがとうございました!

+0

TimeStartとTimeFinishのクラスは何ですか? 'sapply(df、class)'を使用して質問の出力を投稿してください – Sathish

+0

時間部分はどうですか?それはすべて0ですか? – akrun

+0

時間は必要ありません(質問が更新されます)。それはすべて0です。 – user2716568

答えて

2

文字列変換が必要なようです。 「:」の出力と崩壊第二を通じてstrsplitとループを用いて目的の列をループは、.:を交換し、によってnumeric

df[1:2] <- lapply(df[1:2], function(x) 
     as.numeric(sub(":", ".", gsub("^[^:]+:|:[^:]+$", "", x)))) 
df 
# TimeStart TimeFinish ID 
#1  0.00  0.12 1 
#2  5.35  5.55 1 
#3  13.33  13.53 2 
#4  19.26  19.46 2 
+0

2番目の置換はグローバルである必要がありますか?確かに 'sub'はうまくいくでしょう。 –

+0

@NickKennedy私は ':'のように ''を使用しました。 'chartr'でも動作するかもしれません。ありがとうございました。しばらくあなたを見ていない。あなたは私がまだ覚えているいくつかの素晴らしい答えを提供しました – akrun

+1

ありがとう@akrun、私は他のもので忙しかった!私はカジュアルパースの正規表現の真ん中にある '|'を見落としてしまったので、正規表現が入力の全長に亘っているように見えたので、複数回一致することはできませんでした。私は今なぜそれが 'gsub'である必要があるかを見ることができます。ちなみに、as.numeric(sub( "^ \\ d + :(\\ d +):(\\ d +):\\ d + $"、 "\\ 1。\\ 2"、x)) 'はわずかですより多くの型を指定しますが、1回のパスを使用して正規表現の置換を行います。 –

1

分割文字列に変換し、時間とミリ秒の部分を削除するためにgsubを使用します3番目の要素は "。"で始まります。 paste()を使用して、dfデータフレームに割り当てます。

df[, 1:2] <- lapply(df[, 1:2], function(x){ 
    lapply(strsplit(as.character(x), ":"), function(x) paste(x[2:3], collapse = ".")) 
}) 
# TimeStart TimeFinish ID 
# 1  00.00  00.12 1 
# 2  05.35  05.55 1 
# 3  13.33  13.53 2 
# 4  19.26  19.46 2 
2

もう1つのオプションはlapplyです。時間の因子形式をPOSIXctクラスに変換し、分の部分だけをformatで抽出し、それを数値に変換します。

df[1:2] <- lapply(df[1:2], function(x) 
       as.numeric(format(as.POSIXct(x, format = "%H:%M:%OS"), "%M.%S"))) 

df 
# TimeStart TimeFinish ID 
#1  0.00  0.12 1 
#2  5.35  5.55 1 
#3  13.33  13.53 2 
#4  19.26  19.46 2 
関連する問題