2

珍しい日付形式を標準の日付に変換しようとしています。基本的に、次のようにフォーマットされた半年ごとの頻度の期間を含むデータセットがあります。206は2006年の後半を示し、106は前半を示します。それを2006-06-01にそれぞれ2006-01-01に再配置するために、私は小さな関数を書きました:

period2date = function(period)
{
check=list()
check=strsplit(as.character(period),split="")
x=as.numeric(check[[1]][1])
p=ifelse( x >= 2,6,1)
x=2

out=paste(x,"0",check[[1]][2],check[[1]][3],"-",p,"-1",sep="")
out=as.Date(out)


return(out)    
}

あなたは今笑うかもしれません:)。とにかく、その機能は機能し、ここで問題が発生します。この関数をdata.frameの時間列に適用したいと思います。私は次のことを試しました:

as.data.frame(lapply(mydf$period,period2date)) 

これは、私が望むものに最も近い結果を返しました:structure.13665..class .... Date .. 1 2006-06-01

など..明らかに、私の列の名前を保持したいのですが、さらに良いのは、新しくフォーマットされた日付を元のdfに追加することです。さらに、私は試しました:

sapply(mydf$period,period2date) # with results equal to the line below
unlist(lapply(mydf$period,period2date))

[1] 13300 13514 13665

私がやりたいのは、珍しい206などの形式を2006-06-01(機能する)に変更し、mydf(機能しない)に列を追加することだけです。

事前に提案をお願いします!

4

2 に答える 2

2

R日付を数値として格納するため、日付出力を操作しているため(つまり、日付をマトリックスに戻し、実際の数値として表示されるため)、奇妙な動作が発生していると思います。代わりに、でdata.frameを明示的に使用する必要がありますdata.frame()applyまた、ベクトル化された操作を使用すると、時間を節約できる可能性があります(ファミリはまだループを使用していると思います)。

period2date <- function(period) {
    period <- as.character(period)
    half <- substr(period, 1, 1)
    year <- substr(period, 2, 3)
    dates <- as.Date(ifelse(half=="1", paste(year, "0101", sep=""), paste(year, "0701", sep="")), format="%y%m%d")
    return(dates)
}

data <- data.frame(data, period2date(data$dates))

期間/日付の列を追加する副を置き換えることによって、これをよりクリーンにすることもできます。

于 2010-07-09T16:04:20.560 に答える
0

これは奇妙です...:

as.Date(sapply(mydf$period,period2date))

「2006-06-01」「2006-01-01」などを返します。period2date関数にはすでにas.Date()が含まれているので、びっくりしました。これは私の問題の解決策ですが、完全には理解していません...

于 2010-07-09T08:11:02.913 に答える