web-dev-qa-db-ja.com

時間(mm:ss)をRで10進形式に変換する方法

RStudioを使用してcsvファイルをRにインポートしました。ここでは、ゲームごとのポイントをゲームごとの分数に対してプロットしようとしています。ただし、ゲームあたりの分数はmm:ssの形式であり、10進形式に変換する方法を見つけるのに苦労しています。

助けてください!

20
Joe

文字ベクトルから始めることを考えると、これは比較的簡単です。

_minPerGame <- c("4:30","2:20","34:10")

sapply(strsplit(minPerGame,":"),
  function(x) {
    x <- as.numeric(x)
    x[1]+x[2]/60
    }
)
_

与える

_[1]  4.500000  2.333333 34.166667
_

オプション_as.is=TRUE_とともにread.csv()を使用したことを確認してください。それ以外の場合は、as.character()を使用して変換する必要があります。

25
Joris Meys

あなたはそれを10進数化するために必要ですか?たとえば、Rの日時クラスの1つであるクラスPOSIXltのオブジェクトとしてデータを正しい形式で格納すると、Rは時刻の正しい処理を数値形式で処理します。これが私の言いたいことの例です:

まず、説明のためにダミーデータを作成します。

set.seed(1)
DF <- data.frame(Times = seq(as.POSIXlt("10:00", format = "%M:%S"), 
                             length = 100, by = 10),
                 Points = cumsum(rpois(100, lambda = 1)))
head(DF)

ここに日付があるという事実を無視します。すべての観測値が同じ日付部分を持っているため、プロットを行うときに事実上無視されます。次に、Rの式インターフェイスを使用してこれをプロットします。

plot(Points ~ Times, data = DF, type = "o")

これを生成します:

points per game time

9
Gavin Simpson

最初のソリューションの調整:

minPerGame <- paste(sample(1:89,100000,T),sample(0:59,100000,T),sep=":")

f1 <- function(){
sapply(strsplit(minPerGame,":"),
 function(x) {
  x <- as.numeric(x)
  x[1]+x[2]/60
 }
)
}
#
f2<- function(){
 w <- matrix(c(1,1/60),ncol=1)
 as.vector(matrix(as.numeric(unlist(strsplit(minPerGame,":"))),ncol=2,byrow=TRUE)%*%w)
}

system.time(f1())
system.time(f2())

system.time(f1())ユーザーシステムの経過0.88 0.00 0.86

system.time(f2())ユーザーシステムの経過0.25 0.00 0.27

2
Wojciech Sobala