【问题标题】:paste function in r [duplicate]r中的粘贴功能[重复]
【发布时间】:2016-11-27 01:11:30
【问题描述】:

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

在我的数据框中,我有一个格式为“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]

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

【问题讨论】:

    标签: r date paste as.date


    【解决方案1】:

    您在此处需要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"
    

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

    【讨论】:

    • 感谢您的帮助!你的解决方案在逻辑上是有意义的;不幸的是,我仍然遇到问题:> datex View(datex) 视图中的错误:'names' 属性 [1186] 必须与向量的长度相同[1] 这与我之前遇到的错误相同。关于如何解决它的任何建议?
    【解决方案2】:

    创建一个一致的 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"
    

    【讨论】:

    • 如果数据是字符,前导零,则此方法有效。但是海报有没有前导零的整数。 format(as.Date(090410,"%y%m%d"), "%Y-%m-%d")Error in charToDate(x) : character string is not in a standard unambiguous format
    • 感谢您的帮助!你的解决方案在逻辑上是有意义的;不幸的是,我仍然遇到问题:> datex View(datex) 视图中的错误:'names' 属性 [1186] 必须与向量的长度相同[1] 这与我之前遇到的错误相同。关于如何解决它的任何建议?
    • 好的,看起来我可以使用它,但不能查看它...我不明白 R。我想,问题解决了!感谢您的帮助。
    • 哦,这很有趣:> attributes(g.2015.1990$DATE) NULL
    • 当我执行 datex
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 2017-11-10
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多