J'ai un ensemble de données 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
J'aimerais 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 dans l'intérêt, que se passe-t-il si j'ai besoin d'ajouter deux ou trois zéros avant l'identification de l'animal?
data$anim = paste(rep(0, n), data$anim, sep = "")
Réponses:
La version courte: utilisez
formatC
ousprintf
.La version plus longue:
Plusieurs fonctions sont disponibles pour formater les nombres, notamment l'ajout de zéros non significatifs. Le meilleur choix dépend du formatage que vous souhaitez effectuer.
L'exemple de la question est assez facile car 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 aussi.
paste
(et sa variantepaste0
) 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 ajouter un seul zéro,paste0
c'est la meilleure solution.Dans le cas où il y a un nombre variable de chiffres dans les nombres, vous devez calculer manuellement le nombre de zéros à ajouter, ce qui est suffisamment horrible pour que vous ne le fassiez que par curiosité morbide.
str_pad
à partir destringr
travaux similaires àpaste
, ce qui rend plus explicite le fait que vous souhaitez remplir les choses.Encore une fois, il n'est pas vraiment conçu pour être utilisé avec des chiffres, donc le cas le plus difficile nécessite un peu de réflexion. On devrait juste pouvoir dire "pad avec des zéros de largeur 8", mais regardez cette sortie:
Vous devez définir l' option de pénalité scientifique afin que les nombres soient toujours formatés en utilisant une notation fixe (plutôt que la notation scientifique).
stri_pad
dans desstringi
œuvres exactement comme àstr_pad
partir destringr
.formatC
est une interface pour la fonction Cprintf
. Son utilisation nécessite une certaine connaissance des arcanes de cette fonction sous-jacente (voir lien). Dans ce cas, les points importants sont l'width
argument,format
étant"d"
pour "entier", et un"0"
flag
pour les zéros au début.C'est ma solution préférée, car il est facile de bricoler en changeant la largeur et la fonction est suffisamment puissante pour effectuer d'autres changements de mise en forme.
sprintf
est une interface vers la fonction C du même nom; commeformatC
mais avec une syntaxe différente.Le principal avantage de
sprintf
est que vous pouvez intégrer des nombres formatés dans des morceaux de texte plus longs.Voir également la réponse de goodside .
Par souci d'exhaustivité, il convient de mentionner les autres fonctions de formatage qui sont parfois utiles, mais n'ont pas de méthode pour ajouter des zéros.
format
, une fonction générique pour formater tout type d'objet, avec une méthode pour les nombres. Cela fonctionne un peu commeformatC
, mais avec encore une autre interface.prettyNum
est encore une autre fonction de formatage, principalement pour créer des étiquettes de tick d'axe manuel. Il fonctionne particulièrement bien pour de larges plages de nombres.Le
scales
paquet a plusieurs fonctions telles quepercent
,date_format
etdollar
pour les types de format spécialisés.la source
flag = "0"
.?sprintf
page d'aide décrit cela. "mn: deux nombres séparés par un point, indiquant la largeur du champ (m) et la précision (n)."Pour une solution générale qui fonctionne quel que soit le nombre de chiffres
data$anim
, utilisez lasprintf
fonction. Cela fonctionne comme ceci:Dans votre cas, vous voulez probablement:
data$anim <- sprintf("%06d", data$anim)
la source
sprintf
convertit le numérique en chaîne (caractère).Étendre la réponse de @ goodside:
Dans certains cas, vous souhaiterez peut-être remplir une chaîne avec des zéros (par exemple des codes fips ou d'autres facteurs de type numérique). Sous OSX / Linux:
Mais comme
sprintf()
lasprintf()
commande C du système d'exploitation , décrite ici , dans Windows 7, vous obtenez un résultat différent:Donc, sur les machines Windows, le travail est:
la source
str_pad
est maintenant mon rendez-vous.str_pad
de l'stringr
emballage est une alternative.la source
str_pad
car cela peut conduire à des résultats inattendus.i.num = 600000
;str_pad(i.num, width = 7, pad = "0")
vous donnera "006e + 05" et non "0600000"Voici une fonction R de base généralisable:
J'aime
sprintf
mais il est livré avec des mises en garde comme:la source
Voici une autre alternative pour ajouter menant à 0 à des chaînes telles que CUSIP qui peuvent parfois ressembler à un nombre et que de nombreuses applications comme Excel corrompent et suppriment les 0 à gauche ou les convertissent en notation scientifique.
Lorsque j'ai essayé la réponse fournie par @metasequoia, le vecteur renvoyé avait des espaces de tête et non
0
s. C'était le même problème mentionné par @ user1816679 - et la suppression des guillemets autour de0
ou la modification de%d
à%s
ne faisait aucune différence non plus. Pour info, j'utilise RStudio Server fonctionnant 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 dumagrittr
package, cela pourrait ressembler à ceci:sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)
Je préférerais une solution à une fonction, mais cela fonctionne.
la source
la source
paste0(0, data$anim)
marcherait bien.Pour d'autres circonstances dans lesquelles vous souhaitez que la chaîne numérique soit cohérente, j'ai créé une fonction.
Quelqu'un peut trouver cela utile:
Désolé pour le formatage.
la source