1

トライアスロンの各セクションの競技者ごとの時間を含む CSV ファイルがあります。Rが使用できるようにデータを読み取るのに問題があります。データがどのように表示されるかの例を次に示します (わかりやすくするために、いくつかの列を削除しています)。

"Place","Division","Gender","Swim","T1","Bike","T2","Run","Finish"
1, "40-49","M","7:45","0:55","27:07","0:29","18:53","55:07"
2, "UNDER 18","M","5:41","0:28","30:41","0:28","18:38","55:55"
3, "40-49","M","6:27","0:26","29:24","0:40","20:16","57:11"
4, "40-49","M","7:57","0:35","29:19","0:23","19:20","57:32"
5, "40-49","M","6:28","0:32","31:00","0:34","19:19","57:51"
6, "40-49","M","7:42","0:30","30:02","0:37","19:11","58:02"
....
250 ,"18-29","F","13:20","3:23","1:06:40","1:19","38:00","2:02:40"
251 ,"30-39","F","13:01","2:42","1:02:12","1:20","43:45","2:02:58"
252 ,50 ,"F","20:45","1:33","58:09","3:17","40:14","2:03:56"
253 ,"30-39","M","13:14","1:14","DNF","1:11","25:10","DNF bike"
254 ,"40-49","M","10:04","1:41","56:36","2:32",,"D.N.F"

データをプロットする私の最初の素朴な試みは次のようになりました。

> tri <- read.csv(file.choose(), header=TRUE, as.is=TRUE)
> pairs(~ Bike + Run + Swim, data=tri)

時間は賢明な方法でインポートされていないため、チャートは意味がありません。

タイプが見つかり、difftimeそれを使用してデータ ファイル内の時間を解析しようとしました。

時間の代わりに DNF などの行がいくつかあります。解析できない時間の行が破棄されることを嬉しく思います。時刻には、「%M:%S」と「%H:%M:%S」の 2 つの形式があります。

データから新しいデータ フレームを作成する必要があると思いますが、時間を解析できません。これは私がこれまでに持っているものです。

> tri <- read.csv(file.choose(), header=TRUE, as.is=TRUE)
> str(tri)
'data.frame':   254 obs. of  12 variables:
 $ Place     : num  1 2 3 4 5 6 7 8 9 10 ...
 $ Race..    : num  237 274 268 226 267 247 264 257 273 272 ...
 $ First.Name: chr  ** removed names ** ...
 $ Last.Name : chr  ** removed names ** ...
 $ Division  : chr  "40-49" "UNDER 18" "40-49" "40-49" ...
 $ Gender    : chr  "M" "M" "M" "M" ...
 $ Swim      : chr  "7:45" "5:41" "6:27" "7:57" ...
 $ T1        : chr  "0:55" "0:28" "0:26" "0:35" ...
 $ Bike      : chr  "27:07" "30:41" "29:24" "29:19" ...
 $ T2        : chr  "0:29" "0:28" "0:40" "0:23" ...
 $ Run       : chr  "18:53" "18:38" "20:16" "19:20" ...
 $ Finish    : chr  "55:07" "55:55" "57:11" "57:32" ...
> as.numeric(as.difftime(tri$Bike, format="%M:%S"), units="secs")

これにより、1 時間未満のすべての時間が変換されますが、1 時間を超える時間は分として解釈されます。「%M:%S」を「%H:%M:%S」に置き換えると、1 時間以上解析されますが、それ以外の場合は NA が生成されます。両方のタイプの時間を変換する最良の方法は何ですか?

編集: 要求に応じて簡単な例を追加します。

> times <- c("27:07", "1:02:12", "DNF")
> as.numeric(as.difftime(times, format="%M:%S"), units="secs")
[1] 1627   62   NA
> as.numeric(as.difftime(times, format="%H:%M:%S"), units="secs")
[1]   NA 3732   NA

私が望む出力は1627 3732 NA

4

1 に答える 1

4

解決策の簡単なハックを次に示しますが、より良い解決策があるかもしれません。

cdifftime <- function(x) {
   x2 <- gsub("^([0-9]+:[0-9]+)$","00:\\1",x)  ## prepend 00: to %M:%S elements
   res <- as.difftime(x2,format="%H:%M:%S")  
   units(res) <- "secs"
   as.numeric(res)
}
times <- c("27:07", "1:02:12", "DNF")
cdifftime(times)
## [1] 1627 3732   NA

これを関連する列に適用できます。

tri[4:9] <- lapply(tri[4:9],cdifftime)

あなたの例を複製しようとすることからのいくつかのメモ:

  • na.strings="DNF"「終了しなかった」値をNA自動的に設定するために使用することができます
  • 文字列が要因として読み込まれないようにする必要があります。たとえば、(1) set options(stringsAsFactors="FALSE"); (2)stringsAsFactors=FALSE呼び出すときに使用しread.csvます。(3) 使用as.is=TRUE、同上。
于 2012-12-24T16:32:28.963 に答える