【发布时间】:2017-04-05 15:40:35
【问题描述】:
我在 R 中有一个数据框。它有一列包含格式为 Dec-06、Jan-90、Feb-76 等的日期。它们是字符串。如何以这种格式提取年份部分:2006、1990、1976 等?我想丢弃月份段并将其视为年份部分的距离,并将此列视为逻辑回归的连续变量。
我尝试了 R 中提供的几个日期格式包,如 POSIX、lubridate 等,但无法提取。
有什么想法吗?
【问题讨论】:
我在 R 中有一个数据框。它有一列包含格式为 Dec-06、Jan-90、Feb-76 等的日期。它们是字符串。如何以这种格式提取年份部分:2006、1990、1976 等?我想丢弃月份段并将其视为年份部分的距离,并将此列视为逻辑回归的连续变量。
我尝试了 R 中提供的几个日期格式包,如 POSIX、lubridate 等,但无法提取。
有什么想法吗?
【问题讨论】:
format(as.Date(gsub(".*-","","Dec-06"), format = "%y"), "%Y")
#[1] "2006"
或
library(lubridate)
format(myd(paste("Dec-06","-01",sep="")), "%Y")
#[1] "2006"
【讨论】:
我们将字符串转换为Date 类,然后从中仅提取年份。
format(as.Date(paste0("01-", x), "%d-%b-%y"), "%Y")
#[1] "2006" "1990" "1976"
数据
x <- c("Dec-06", "Jan-90", "Feb-76 ")
【讨论】:
使用lubridate,很简单,年份函数是lubridate的一部分:
library(lubridate)
dat <- data.frame(x=c("Mar-06","Jan-90","May-76"))
dat$date <- as.POSIXlt(paste0("01-",tolower(dat$x)),format="%d-%b-%y",origin="1970-01-01")
dat$year <- year(dat$date)
答案:
> dat
x date year
1 Mar-06 2006-03-01 2006
2 Jan-90 1990-01-01 1990
3 May-76 1976-05-01 1976
【讨论】:
这是zoo的另一个选项
library(zoo)
data.table::year(as.yearmon("Dec-06", "%b-%y"))
#[1] 2006
或者正如@G.Grothendieck 提到的,as.integer 返回year
as.integer(as.yearmon("Dec-06", "%b-%y"))
#[1] 2006
【讨论】:
year 的来源,但您可以使用as.integer 代替它以避免进一步的依赖。