我有一个像这样的数据框(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
答案 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