在R中修剪和重新格式化日期

时间:2016-07-19 03:12:12

标签: r date-conversion

我有一列数据,其中包含以下类型的日期和数字条目:

16-Jun
21-01A
7-04
Aug-99
5-09

我想通过做两件事将这些全部转换为数字。首先,如果数据在破折号之前有一个数字(如前三个示例中所示),我想从破折号开始修剪数据。因此条目将显示为16,21和7。

其次,如果条目以月 - 日格式(例如Aug-99)写入,我想将其转换为月份的数字,然后修剪它。所以这个例子就是将日期转换为8-99然后修剪为8。

我怎样才能在R中这样做?当我使用grep,sub和match命令时,如下面的答案,我得到: [1] 16 21 7 5 8

当我之后:[1] 16 21 7 8 5

1 个答案:

答案 0 :(得分:1)

我们使用grep来查找以字母开头的元素索引。使用-删除从sub开始到字符串末尾的子字符串。根据'i1'对'v2'进行子集并转换为numeric,同时我们match以字母为开头month.abb并获取月份索引,连接输出。

i1 <- grepl("^[A-Z]", v1)
v2 <- sub("-.*", "", v1)
c(as.numeric(v2[!i1]), match(v2[i1], month.abb))
#[1] 16 21  7  8

对于新数据集,我们可以使用ifelse

i1 <- grepl("^[A-Z]", df1$v1)
v2 <- sub("-.*", "", df1$v1)
as.numeric(ifelse(i1, match(v2, month.abb), v2))
#[1] 16 21  7  8  5

数据

v1 <- c('16-Jun','21-01A','7-04','Aug-99') 
df1 <- structure(list(v1 = c("16-Jun", "21-01A", "7-04", "Aug-99", "5-09"
)), .Names = "v1", class = "data.frame", row.names = c(NA, -5L))