私は巨大なデータフレームを持ってdf
おり、1つの列に次のような「年-月」の値があります:「YYYYMM」。現在、データ型は数値です。スナップショット:
> df[[1]][1:10]
[1] 201001 201001 201001 201001 201001 201001 201001 201001 201001 201001
> str(df)
'data.frame': 2982393 obs. of 11 variables:
$ YearMonth : int 201001 201001 201001 201001 201001 201001 201001 201001 201001 201001 ...
$ ...
私が欲しいのは、この値を「YYYY-MM」の形式の文字列(最終的には係数)に変換して、これを他のデータフレームと比較できるようにすることです。
値を変換する簡単な方法を見つけるのに苦労しています。
as.Date
と機能を使ってみましたformat
。ただし、値には日がないため、文字列では機能しませんでした。Numerics(データフレーム列と同じ)では、他の問題も発生しました。
> as.Date("201001", format = "%Y%m")
[1] NA
> as.Date(201001, format = "%Y%m")
Error in as.Date.numeric(201001, format = "%Y%m") :
'origin' must be supplied
> as.Date(df[[1]], format = "%Y%m")
Error in as.Date.numeric(df[[1]], format = "%Y%m") :
'origin' must be supplied
subset
文字列を使用して連結することで、1つの値だけを変換できます。1つの要素を処理するために、以下の式を作成しました。
transformString <- function( x ) { # x = value
return ( paste(cbind(substring(x, 1, 4),"-",substring(x,5,6)), collapse = '') )
}
問題:すべての要素をトラバースする以外に、その関数をdata.frameの列全体に適用する簡単な方法が見つかりませんでした。
transformStringVector <- function( x ) { # x = vector
for(i in 1:length(x)) {
x[i]<-transformString(x[i])
}
return ( x )
}
これはエレガントとはほど遠いものであり、パフォーマンスに悪影響を及ぼします。apply
私は(以下を参照)などを使おうとしましたが、エラーに直面しました...(私は実際にはapply
機能を取得していないことを認めます)
> temp <- apply(df[[1]], 1, transformString )
Error in apply(df[[1]], 1, transformString ) :
dim(X) must have a positive length
巨大なdata.frame内でこの変換の代替手段を持っている人はいますか?またはもっと一般的に; data.frame内の要素に文字列のような変換を適用する簡単な方法はありますか?