as.Date for for循环执行意外

时间:2013-07-10 04:03:40

标签: r for-loop coercion

为什么在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

1 个答案:

答案 0 :(得分:4)

单个原子矢量只能是单个类

当您使用[<-替换df.for的单个值时,R无法将您未更改的值保存为看起来像日期的“字符”变量,以及日期类值(形成并显示为字符的数字)。因此它强迫性格。

您可以通过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")
}

或者通过将结果强制回到循环结束时的日期(通过数字)

例如

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')