Ajouter des zéros à l’aide de R

J’ai un dataset qui ressemble à ceci:

anim <- c(25499,25500,25501,25502,25503,25504) sex <- c(1,2,2,1,2,1) wt <- c(0.8,1.2,1.0,2.0,1.8,1.4) data <- data.frame(anim,sex,wt) data anim sex wt anim2 1 25499 1 0.8 2 2 25500 2 1.2 2 3 25501 2 1.0 2 4 25502 1 2.0 2 5 25503 2 1.8 2 6 25504 1 1.4 2 

Je voudrais qu’un zéro soit ajouté avant chaque identifiant d’animal:

 data anim sex wt anim2 1 025499 1 0.8 2 2 025500 2 1.2 2 3 025501 2 1.0 2 4 025502 1 2.0 2 5 025503 2 1.8 2 6 025504 1 1.4 2 

Et par intérêt, et si je devais append deux ou trois zéros avant l’identifiant de l’animal?

La version courte: utilisez formatC ou formatC .


La version plus longue:

Plusieurs fonctions sont disponibles pour le formatage des nombres, y compris l’ajout de zéros en tête. Le meilleur choix dépend de quel autre format vous voulez faire.

L’exemple de la question est assez simple puisque toutes les valeurs ont le même nombre de chiffres pour commencer, alors essayons un exemple plus difficile de faire des puissances de 10 largeur 8 également.

 anim < - 25499:25504 x <- 10 ^ (0:5) 

paste (et sa variante paste0 ) sont souvent les premières fonctions de manipulation de chaînes que vous rencontrez. Ils ne sont pas vraiment conçus pour manipuler des nombres, mais ils peuvent être utilisés pour cela. Dans le cas simple où nous devons toujours append un seul zéro, paste0 est la meilleure solution.

 paste0("0", anim) ## [1] "025499" "025500" "025501" "025502" "025503" "025504" 

Dans le cas où il y a un nombre variable de chiffres dans les nombres, vous devez calculer manuellement le nombre de zéros à append, ce qui est assez horrible pour que vous ne le fassiez que par curiosité morbide.


str_pad de ssortingngr fonctionne de la même manière que paste , ce qui rend plus explicite le fait que vous vouliez protéger les choses.

 library(ssortingngr) str_pad(anim, 6, pad = "0") ## [1] "025499" "025500" "025501" "025502" "025503" "025504" 

Encore une fois, ce n'est pas vraiment conçu pour être utilisé avec des nombres, donc le cas le plus difficile nécessite un peu de reflection. On devrait juste pouvoir dire "pad avec des zéros à la largeur 8", mais regardez cette sortie:

 str_pad(x, 8, pad = "0") ## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05" 

Vous devez définir l' option de pénalité scientifique pour que les nombres soient toujours formatés en utilisant une notation fixe (plutôt qu'une notation scientifique).

 library(withr) with_options( c(scipen = 999), str_pad(x, 8, pad = "0") ) ## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000" 

ssorting_pad in ssortingngi fonctionne exactement comme str_pad de ssortingngr .


formatC est une interface avec la fonction C printf . Son utilisation nécessite une certaine connaissance des arcanes de cette fonction sous-jacente (voir lien). Dans ce cas, les points importants sont l'argument width , le format étant "d" pour "integer" et un flag "0" pour les zéros précédant.

 formatC(anim, width = 6, format = "d", flag = "0") ## [1] "025499" "025500" "025501" "025502" "025503" "025504" formatC(x, width = 8, format = "d", flag = "0") ## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000" 

C'est ma solution préférée, car il est facile de bricoler en changeant la largeur, et la fonction est assez puissante pour apporter d’autres modifications de formatage.


sprintf est une interface avec la fonction C du même nom; comme formatC mais avec une syntaxe différente.

 sprintf("%06d", anim) ## [1] "025499" "025500" "025501" "025502" "025503" "025504" sprintf("%08d", x) ## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000" 

Le principal avantage de sprintf est que vous pouvez intégrer des nombres formatés dans des bits de texte plus longs.

 sprintf( "Animal ID %06d was a %s.", anim, sample(c("lion", "tiger"), length(anim), replace = TRUE) ) ## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger." ## [3] "Animal ID 025501 was a lion." "Animal ID 025502 was a tiger." ## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion." 

Voir aussi la réponse de goodside .


Pour être complet, il convient de mentionner les autres fonctions de formatage parfois utiles, mais qui ne prévoient aucune méthode pour append des zéros.

format , une fonction générique pour formater tout type d'object, avec une méthode pour les nombres. Cela fonctionne un peu comme formatC , mais avec une autre interface.

prettyNum est une autre fonction de formatage, principalement pour créer des étiquettes de prettyNum axe manuels. Cela fonctionne particulièrement bien pour de nombreuses gammes de numéros.

Le package d' scales a plusieurs fonctions telles que percent , date_format et dollar pour les types de format spécialisés.

Pour une solution générale qui fonctionne quel que soit le nombre de chiffres contenus dans data$anim , utilisez la fonction sprintf . Cela fonctionne comme ceci:

 sprintf("%04d", 1) # [1] "0001" sprintf("%04d", 104) # [1] "0104" sprintf("%010d", 104) # [1] "0000000104" 

Dans votre cas, vous voulez probablement: data$anim < - sprintf("%06d", data$anim)

Expansion sur la réponse de @ goodside:

Dans certains cas, vous souhaiterez peut-être insérer une chaîne avec des zéros (par exemple, des codes Fips ou d’autres facteurs numériques). Sous OSX / Linux:

 > sprintf("%05s", "104") [1] "00104" 

Mais parce que sprintf() appelle la commande C sprintf() du système d’exploitation, décrite ici , dans Windows 7, vous obtenez un résultat différent:

 > sprintf("%05s", "104") [1] " 104" 

Donc, sur les machines Windows, le travail est le suivant:

 > sprintf("%05d", as.numeric("104")) [1] "00104" 

str_pad du paquet ssortingngr est une alternative.

 anim = 25499:25504 str_pad(anim, width=6, pad="0") 
 data$anim < - sapply(0, paste0,data$anim) 

Voici une autre alternative pour l’ajout de 0 à des chaînes telles que CUSIP qui peuvent parfois ressembler à un nombre et que de nombreuses applications telles qu’Excel vont corrompre et supprimer les 0 principaux ou les convertir en notation scientifique.

Lorsque j’ai essayé la réponse fournie par @metasequoia, le vecteur renvoyé comportait des espaces avant 0 s. C’était le même problème mentionné par @ user1816679 – et supprimer les guillemets autour du 0 ou changer de %d en %s ne faisait pas non plus de différence. Pour info, j’utilise RStudio Server sur un serveur Ubuntu. Cette petite solution en deux étapes a fonctionné pour moi:

gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))

en utilisant la fonction %>% pipe du paquetage magrittr , cela pourrait ressembler à ceci:

sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)

Je préférerais une solution à une fonction, mais ça marche.

Pour les autres circonstances dans lesquelles vous souhaitez que la chaîne de caractères soit cohérente, j’ai créé une fonction.

Quelqu’un peut trouver cela utile:

 idnamer< -function(x,y){#Alphabetical designation and number of integers required id<-c(1:y) for (i in 1:length(id)){ if(nchar(id[i])<2){ id[i]<-paste("0",id[i],sep="") } } id<-paste(x,id,sep="") return(id) } idnamer("EF",28) 

Désolé pour le formatage.