month.abb []导致错误的结果

时间:2016-06-30 14:31:37

标签: r string datetime

我有以下数据集。我试图将date_1字段分为月和日。然后将月份号转换为月份名称。

date_1,no_of_births_1
1/1,1482
2/2,1213
3/23,1220
4/4,1319
5/11,1262
6/18,1271

我正在使用month.abb[]将月号转换为name。但是,不是为月份数的每个值提供月份名称,而是生成错误的数组。 例如:month.abb[2]正在生成4月而不是2月。

  date_1 no_of_births_1 V1 V2 month
1    1/1           1482  1  1   Jan
2    2/2           1213  2  2   Apr
3   3/23           1220  3 23   May
4    4/4           1319  4  4   Jun
5   5/11           1262  5 11   Jul
6   6/18           1271  6 18   Aug

下面是我正在使用的代码,

birthday<-read.csv("Birthday_s.csv",header = TRUE)
birthday$date_1<-as.character(birthday$date_1)
#split the data
listx<-sapply(birthday$date_1,function(x) strsplit(x,"/"))
library(base)
#convert to data frame
mat<-as.data.frame(matrix(unlist(listx),ncol = 2, byrow = TRUE))
#combine birthday and mat
birthday2<-cbind(birthday,mat)
#convert month number to month name
birthday2$month<-sapply(birthday2$V1, function(x) month.abb[as.numeric(x)])

1 个答案:

答案 0 :(得分:0)

当我运行你的代码时,我得到了正确的月份。但是,您的代码比必要的更复杂。以下是从stringsAsFactors=FALSE中提取月和日的两种方法:

首先,当您阅读数据时,请使用birthday <- read.csv("Birthday_s.csv",header = TRUE, stringsAsFactors=FALSE) ,这可以防止字符串转换为因子。

library(lubridate)

birthday$month = month(as.POSIXct(birthday$date_1, format="%m/%d"), abbr=TRUE, label=TRUE)
birthday$day = day(as.POSIXct(birthday$date_1, format="%m/%d"))

使用日期函数提取月份和日期:

birthday$month = month.abb[as.numeric(gsub("([0-9]{1,2}).*", "\\1", birthday$date_1))]
birthday$day = as.numeric(gsub(".*/([0-9]{1,2}$)", "\\1", birthday$date_1))

使用正则表达式提取月份和日期:

{{1}}