我有以下数据集。我试图将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[]
将月份数字转换为名称。但是没有为每个月号的值提供月名,结果生成了错误的数组。例如:month.abb[2]
生成Apr而不是february
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)])
当我运行你的代码时,我得到了正确的月份。但是,您的代码过于复杂。下面是从date_1
中提取月和日的两种方法:
首先,在读取数据时,使用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))