将单独的Year和Month列合并为单个Date Column

时间:2016-09-09 21:44:13

标签: r

我有一个像这样的数据框(df):

    code     year  month
1 YYOOGG    2011    8
2 YYOOGG    2011    1
3 YYOOGG    2011    4
4 YYOOGG    2011    3
5 YYOOGG    2011    12
6 YYOOGG    2011    9

我需要使用Date创建第4列:

    code     year  month  Date
1 YYOOGG    2011    8     2011-08
2 YYOOGG    2014    1     2014-01
3 YYOOGG    2016    4     2016-04
4 YYOOGG    2009    3     2009-03
5 YYOOGG    2000    12    2000-12
6 YYOOGG    2010    9     2010-09

我试过了:

  df$Date <- as.Date(paste(df$year, df$month, sep="-"), "%Y-%M")

但我得到以下日期:

2011-09-09

3 个答案:

答案 0 :(得分:6)

我使用zoo::as.yearmon如下

df$Date <- as.yearmon(paste(df$year, df$month), "%Y %m")

它看起来不像所需的输出(即2011-01)。

然而,IMO这种方法比m0h3n更好,因为df$Date将被保存为yearmon对象而不是字符串。因此,您可以像日期一样处理它。例如,如果您将df$Date保存为字符串,那么您将很难在一段时间内绘制数据等...

答案 1 :(得分:3)

日期通常包含一天,否则它实际上不是日期。出于这个原因,我将为新列创建一个字符向量。只使用基数R,您可以使用sprintf()将两列放在一起,在month列的任何位置添加零...

within(df, Date <- sprintf("%d-%02d", year, month))
#     code year month    Date
# 1 YYOOGG 2011     8 2011-08
# 2 YYOOGG 2011     1 2011-01
# 3 YYOOGG 2011     4 2011-04
# 4 YYOOGG 2011     3 2011-03
# 5 YYOOGG 2011    12 2011-12
# 6 YYOOGG 2011     9 2011-09

或者

df$Date <- with(df, sprintf("%d-%02d", year, month))

答案 2 :(得分:0)

您可以尝试这种方式,但之前的OP有更好的代码

data <-  data.frame(code=c("ABCF","DEFG"), year = c(2011,2012), month = c(08,12))



for(i in 1:nrow(data)){
if(nchar(data$month[i])==1){
  data$Date[i] <- paste(data$year[i],data$month[i],sep="-0")
}else{
  data$Date[i] <- paste(data$year[i],data$month[i],sep="-")
  }
}

data
  code year month    Date
1 ABCF 2011     8 2011-08
2 DEFG 2012    12 2012-12