【问题标题】:Fixing Date Column in Data Frame修复数据框中的日期列
【发布时间】:2017-07-25 00:11:43
【问题描述】:

这似乎可以快速解决,但我现在已经被难住了一段时间。

在我的数据框中,我有一个日期列。但是,日期列在一行中显示为年,然后在同一列中接下来的几行中显示该年的所有月份,然后是下一年,然后是当年的月份,依此类推。看起来像这样的东西:

c("2011", "7", "8", "9", "10", "11", "12", "2012", "1", "2") 

我的问题是,我如何将那一年附加到每个月的月底?另一个主要问题是我将为许多不同的数据帧自动化,这些数据帧从不同的月份和年份开始。例如,一个数据帧可能从 2013 年 6 月开始,而另一个数据帧从 2012 年 9 月开始。

我已经考虑了很长时间,并提出了以下想法: 对于每一行,查看前面的 12 行(一年中有多少个月)并找到字符串长度为 4 的元素(对于“2012”或其他年份;顺便说一下,每个月的字符串长度为 3) .但是,这会失败,因为如果数据从 2011 年 10 月开始。那么第一年我们只得到 3 个月,然后当我运行该算法时,它将进入负值的行,这将导致左右错误R.

我非常感谢您对此的帮助。对于我需要解决的大量数据帧,我似乎无法解决这个问题。

【问题讨论】:

  • 你的意思是像dat <- data.frame(date=c("2011","8","9","10","11","12","2012","11","12"),stringsAsFactors=FALSE)这样的吗?
  • @thelatemail 就是这样,我会编辑帖子

标签: r date


【解决方案1】:

将每个组标识为一个顺序计数器,然后按要求替换所有值:

ave(
  x,
  cumsum(grepl("\\d{4}", x)),
  FUN=function(v) replace(v, -1, paste(v[-1],v[1],sep="-"))
)
# [1] "2011"    "7-2011"  "8-2011"  "9-2011"  "10-2011"
# [6] "11-2011" "12-2011" "2012"    "1-2012"  "2-2012" 

【讨论】:

    【解决方案2】:

    使用 zoo 包中的 na.locf 获取每一行的年份,year,然后转换为 "yearmon" 类(也在 zoo 中)。最后省略年份(或不取决于您想要的)并根据需要选择格式化年份/月份。

    library(zoo)
    
    # input
    dat <- c("2011", "7", "8", "9", "10", "11", "12", "2012", "1", "2") 
    
    year <- na.locf(ifelse(nchar(dat) == 4, dat, NA))
    ym <- as.yearmon(paste(year, dat, sep = "-"))
    

    然后根据您的需要尝试其中一种:

    na.omit(ym)
    ## [1] "Jul 2011" "Aug 2011" "Sep 2011" "Oct 2011" "Nov 2011" "Dec 2011" "Jan 2012" "Feb 2012"
    
    format(na.omit(ym), "%Y-%m")
    ## [1] "2011-07" "2011-08" "2011-09" "2011-10" "2011-11" "2011-12" "2012-01" "2012-02"
    
    ifelse(is.na(ym), year, format(ym))
    ## [1] "2011" "Jul 2011" "Aug 2011" "Sep 2011" "Oct 2011" "Nov 2011" "Dec 2011" "2012" "Jan 2012" "Feb 2012"
    
    ifelse(is.na(ym), year, format(ym, "%Y-%m"))
    ## [1] "2011"    "2011-07" "2011-08" "2011-09" "2011-10" "2011-11" "2011-12" "2012"    "2012-01" "2012-02"
    

    有关na.locf 和"yearmon" 类的更多信息,请参阅动物园文档。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      相关资源
      最近更新 更多