I have the following data set. I am trying to split the date_1 field into month and days. Then converting the month number to a month name.
date_1,no_of_births_1 1/1,1482 2/2,1213 3/23,1220 4/4,1319 5/11,1262 6/18,1271 I am using month.abb[] for converting the month number to name. But instead of providing month name for each value of month number, the result is generating wrong array. for example: month.abb[2] is generating Apr instead of Feb.
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 below is the code i am using,
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)]) 01 Answer
When I run your code, I get the correct months. However, your code is more complicated than necessary. Here are two ways to extract month and day from date_1:
First, when you read the data, use stringsAsFactors=FALSE, which prevents strings from getting converted to factors.
birthday <- read.csv("Birthday_s.csv",header = TRUE, stringsAsFactors=FALSE) Extract month and days using date functions:
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")) Extract month and days using Regular Expressions:
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