0

for ループ内でのこの (確かに非正統的な) 使用がas.Date予期しない結果をもたらすのはなぜですか?

次の日付ベクトルがあります。

df.1 <- c("30-Sep-12", "30-Nov-12", "30-Sep-12", 
  "30-Nov-12", "30-Sep-12", "30-Nov-12", 
  "30-Sep-12")

もちろん、標準の日付形式で取得するには、次を使用できます

df.date <- as.Date(df.1, format="%d-%b-%y")

forしかし、スクリプトのコンテキストでは、ループを使用したかったのです。

as.Date(df.1[6], format="%d-%b-%y")  # "30-Sep-12"
# [1] 2012-11-30  # as expected

df.for <- df.1
for (i in seq_along(df.1)){
df.for[i] <- as.Date(df.1[i], format="%d-%b-%y")
}
df.for[6]
# [1] 15674  # unexpected
4

1 に答える 1

4

1 つのアトミック ベクトルは、1 つのクラスにのみ属することができます

[<-の単一の値を置き換えるためにを使用する場合df.forR変更していない値を、Date のように見える「文字」変数、および Date クラスの値 (文字のようにフォーマットおよび表示される数値) として保持することはできません。したがって、それは性格を強要します。

df.forを作成することでこれを回避できますlist

例えば

df.for <- as.list(df.1)
for (i in seq_along(df.1)){
  df.for[[i]] <- as.Date(df.1[i], format="%d-%b-%y")
}

または、ループの最後に結果を強制的に Date に戻すことによって (数値を介して)

例えば

df.for <- df.1
for (i in seq_along(df.1)){
  df.for[i] <- as.Date(df.1[i], format="%d-%b-%y")
}

as.Date(as.numeric(df.for),origin = '1970-01-01')
于 2013-07-10T04:17:23.227 に答える