我有一个奇怪格式化日期列的数据框.我想创建一个列,只显示原始日期列中的年份,我无法想出一个方法来执行此操作,因为当前日期列被视为一个因素.任何关于如何有效地做到这一点的建议将不胜感激.
示例
开头:
org <- c("a","b","c","d")
country <- c("1","2","3","4")
date <- c("01-09-14","01-10-07","11-31-99","10-31-12")
toy <- data.frame(cbind(org,country,date))
toy
org country date
1 a 1 01-09-14
2 b 2 01-10-07
3 c 3 11-31-99
4 d 4 10-31-12
str(toy$date)
Factor w/ 4 levels "01-09-14","01-10-07",..: 1 2 4 3
Run Code Online (Sandbox Code Playgroud)
期望的结果:
org country Year
1 a 1 2014
2 b 2 2007
3 c 3 1999
4 d 4 2012
Run Code Online (Sandbox Code Playgroud)
这应该工作:
transform(toy,Year=format(strptime(date,"%m-%d-%y"),"%Y"))
Run Code Online (Sandbox Code Playgroud)
这产生了
## org country date Year
## 1 a 1 01-09-14 2014
## 2 b 2 01-10-07 2007
## 3 c 3 11-31-99 <NA>
## 4 d 4 10-31-12 2012
Run Code Online (Sandbox Code Playgroud)
我最初认为NA
价值是因为%y
格式指标不够智能,无法处理上个世纪的日期,但?strptime
他说:
'%y'没有世纪的年份(00-99).在输入时,值00到68的前缀为20和69到99乘以19 - 这是2004和2008 POSIX标准指定的行为,但他们也说'预计在未来的版本中,默认世纪是从一个两位数的年份将改变'.
暗示它应该能够处理它.
问题实际上是11月31日不存在......
(您可以随意放下date
专栏...)