39

日付ベクトルの年が 2 桁の場合、mdy()は 00 から 68 までの年を 21 世紀の年に、69 から 99 までの年を 20 世紀の年に変換します。例えば:

library(lubridate)    
mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))

次の出力が得られます。

Multiple format matches with 5 successes: %m/%d/%y, %m/%d/%Y.
Using date format %m/%d/%y.
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC" "2004-01-02 UTC"

間違った日付から 100 を引いて 2054 と 2068 を 1954 と 1968 にすることで、事後にこれを修正できます。解析プロセス自体?

更新: @JoshuaUlrich が私に指摘した後、この質問strptimeを見つけました。これは、私のものと同様の問題を扱っていますが、ベース R を使用しています。

R での日付処理への追加は、日付解析関数内で 2 桁の日付の世紀選択カットオフを処理する何らかの方法であるように思われます。

4

3 に答える 3

35

これを可能にする関数を次に示します。

library(lubridate)
x <- mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))


foo <- function(x, year=1968){
  m <- year(x) %% 100
  year(x) <- ifelse(m > year %% 100, 1900+m, 2000+m)
  x
}

やってみて:

x
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

foo(x)
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

foo(x, 1950)
[1] "1954-01-02 UTC" "1968-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC"
[5] "2004-01-02 UTC"

ここでのちょっとした魔法は、剰余演算子を使用し%%て除算の小数部分を返すことです。したがって1968 %% 100、68 が得られます。

于 2012-10-18T15:12:31.667 に答える
3

これとまったく同じバグ/機能が発生しました。

Excelタイプの日付(これが最も得られる場所)からRが使用できるものに変換するのに役立つ、次の2つの簡単な関数を作成することになりました。

受け入れられた答えには何も問題はありません。パッケージに負荷をかけすぎたくないというだけです。

まず、年を分割して置き換えるヘルパー...

year1900 <- function(dd_y, yrFlip = 50)
{
    dd_y <- as.numeric(dd_y)
    dd_y[dd_y > yrFlip] <- dd_y[dd_y > yrFlip] + 1900
    dd_y[dd_y < yrFlip] <- dd_y[dd_y < yrFlip] + 2000
    return(dd_y)
}

タイプに応じて、Excel の日付を「修正」する関数によって使用されます。

XLdate <- function(Xd, type = 'b-Y')
{
    switch(type,
        'b-Y' = as.Date(paste0(substr(Xd, 5, 9), "-", substr(Xd, 1, 3), "-01"), format = "%Y-%b-%d"),
        'b-y' = as.Date(paste0(year1900(substr(Xd, 5, 6)), "-", substr(Xd, 1, 3), "-01"), 
                        format = "%Y-%b-%d"),
        'Y-b' = as.Date(paste0(substr(Xd, 1, 3), "-", substr(Xd, 5, 9), "-01"), format =     "%Y-%b-%d")
        )
}

お役に立てれば。

于 2013-06-01T09:27:33.120 に答える