2016-06-30 3 views
0

J'ai le jeu de données suivant. J'essaie de diviser le champ date_1 en mois et en jours. Puis convertir le numéro du mois en un nom de mois.month.abb [] donne des résultats incorrects

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

J'utilise month.abb[] pour convertir le nombre de mois au nom. Mais au lieu de fournir un nom de mois pour chaque valeur du nombre de mois, le résultat génère un mauvais tableau. par exemple: month.abb[2] est la génération avril au lieu de février

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 

ci-dessous est le code que je utilise,

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)]) 

Répondre

0

Quand je lance votre code, je reçois les mois corrects. Cependant, votre code est plus compliqué que nécessaire. Voici deux façons d'extraire le mois et le jour de date_1:

D'abord, lorsque vous lisez les données, utilisez stringsAsFactors=FALSE, ce qui empêche la conversion des chaînes en facteurs.

birthday <- read.csv("Birthday_s.csv",header = TRUE, stringsAsFactors=FALSE) 

mois Extrait et jours en utilisant les fonctions de date:

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")) 

mois Extrait et jours en utilisant des expressions régulières:

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)) 
+0

je tentais d'extraire les noms de mois sans utiliser fonctions de date. Oui ça rend plus compliqué. –