r

时间:2016-07-23 04:30:49

标签: r date paste as.date

我认为这应该是一个非常容易解决的问题;但是,我在这里找不到它;而且,我在其他地方发现的指示没有奏效。我所要做的就是使用简单的粘贴功能。

在我的数据框中,我有一个格式为“yymmdd”的日期变量:

> str(g.2015.1990$DATE)
 int [1:60464] 150410 150411 150412 150420 150421 150422 150423 150424 150425 150426 ...

R将此解释为整数,但我需要将其格式化为日期。当我进入2000-2009这十年时,我的问题出现了。 R降低前导0。因此,2001-2009格式为“ymmdd”; 2000年10月至12月格式化为“mmdd”;并且,2000年1月到9月的格式为“mdd”。

我认为我可以将矢量分成四个部分(我必须逐年对其进行组合才能组装它)并在适当的时候在前面粘贴无,一,二或三个0来创建一个一致的6位数字符串,然后我可以将其转换为日期。

我还没有花时间将这个变量分解为上述部分,因为我还没有找到解决问题的成功方法;然而,这是我在整个变量上测试的内容:

datex = paste("0", g.2015.1990$DATE, sep = "")
datex = paste(0, g.2015.1990$DATE, sep = "")
datex = paste("0", as.character(g.2015.1990$DATE), sep = "")
datex = paste(0, as.character(g.2015.1990$DATE), sep = "")

每个人都会返回相同的错误:

Error in View : 'names' attribute [1254] must be the same length as the vector [1]

请告诉我我做错了什么!我发誓这应该是容易解决的。

2 个答案:

答案 0 :(得分:2)

您需要sprintf(),而不是paste。然后你可以使用任何日期转换功能,但我喜欢lubridate

# say you have 2009-10-11 and 2010-10-11, but yymmdd and numeric, so leading
# 0 is dropped on '09...
your_vec <- c(91011, 101011)

# convert to 6 char string (result: "091011" "101011")
new_vec <- sprintf('%06d', your_vec)

# but if you must use paste... (same result: "091011" "101011")
ifelse(nchar(your_vec) == 5, paste0('0', your_vec), your_vec)

# either way, now you can make it a date
library(lubridate)
ymd(new_vec)

# result:
# "2009-10-11 UTC" "2010-10-11 UTC"

(我选择了新的示例数据,因为上面的数据并没有实际存在缺少前导零的问题)

答案 1 :(得分:1)

  

创建一个一致的6位数字符串,然后我可以将其转换为日期。

所以你需要:

datex <- sprintf("%06d", g.2015.1990$DATE)
## formatted string: 6-digit integer, padding 0 ahead

示例

sprintf("%06d", 150410)    ## 2015-04-10
# "150410"

sprintf("%06d", 90410)    ## 2009-04-10
# "090410"

sprintf("%06d",410)    ## 2000-04-10
[1] "000410"

如果您以后想要将datex转换为Date对象,请执行:

datex <- as.Date(datex, "%y%m%d")

示例

as.Date("150410", "%y%m%d")
# [1] "2015-04-10"

as.Date("090410", "%y%m%d")
# [1] "2009-04-10"

as.Date("000410", "%y%m%d")
# [1] "2000-04-10"