Tengo un conjunto de datos que se parece a esto:
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
Me gustaría agregar un cero antes de cada identificación de 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
Y por interés, ¿qué pasa si necesito agregar dos o tres ceros antes de la identificación del animal?

data$anim = paste(rep(0, n), data$anim, sep = "")Respuestas:
La versión corta: use
formatCosprintf.La versión más larga:
Hay varias funciones disponibles para formatear números, incluida la adición de ceros a la izquierda. Cuál es el mejor depende de qué otro formato desea hacer.
El ejemplo de la pregunta es bastante fácil ya que todos los valores tienen el mismo número de dígitos para comenzar, así que intentemos un ejemplo más difícil de hacer potencias de 10 ancho 8 también.
paste(y su variantepaste0) son a menudo las primeras funciones de manipulación de cadenas que se encuentran. Realmente no están diseñados para manipular números, pero pueden usarse para eso. En el caso simple donde siempre tenemos que anteponer un solo cero,paste0es la mejor solución.Para el caso donde hay un número variable de dígitos en los números, debe calcular manualmente cuántos ceros anteponer, lo cual es lo suficientemente horrible como para hacerlo solo por curiosidad mórbida.
str_padfromstringrfunciona de manera similar apaste, lo que hace más explícito que desea rellenar las cosas.Nuevamente, no está realmente diseñado para su uso con números, por lo que el caso más difícil requiere un poco de reflexión. Deberíamos poder decir "pad con ceros a ancho 8", pero mira esta salida:
Debe configurar la opción de penalización científica para que los números siempre estén formateados con notación fija (en lugar de notación científica).
stri_padenstringitrabajos exactamente comostr_paddestringr.formatCes una interfaz a la función Cprintf. Su uso requiere cierto conocimiento de los arcanos de esa función subyacente (ver enlace). En este caso, los puntos importantes son elwidthargumento, queformates"d"para "entero" y a"0"flagpara preceder ceros.Esta es mi solución favorita, ya que es fácil jugar con el cambio de ancho, y la función es lo suficientemente potente como para hacer otros cambios de formato.
sprintfes una interfaz para la función C del mismo nombre; comoformatCpero con una sintaxis diferente.La principal ventaja de
sprintfes que puede incrustar números formateados dentro de fragmentos de texto más largos.Ver también la respuesta de Goodside .
Para completar, vale la pena mencionar las otras funciones de formato que ocasionalmente son útiles, pero que no tienen un método de anteponer ceros.
format, una función genérica para formatear cualquier tipo de objeto, con un método para números. Funciona un poco comoformatC, pero con otra interfaz más.prettyNumes otra función de formato, principalmente para crear etiquetas de marca de eje manuales. Funciona particularmente bien para amplios rangos de números.El
scalespaquete tiene varias funciones comopercent,date_formatydollarpara tipos de formatos especializados.fuente
flag = "0".?sprintfpágina de ayuda describe esto. "mn: Dos números separados por un punto, que denotan el ancho del campo (m) y la precisión (n)".Para una solución general que funcione independientemente de cuántos dígitos haya
data$anim, use lasprintffunción. Funciona así:En tu caso, probablemente quieras:
data$anim <- sprintf("%06d", data$anim)fuente
sprintfconvierte numérico a cadena (carácter).Ampliando la respuesta de @ goodside:
En algunos casos, es posible que desee rellenar una cadena con ceros (por ejemplo, códigos fips u otros factores numéricos). En OSX / Linux:
Pero debido a que
sprintf()llama alsprintf()comando C del sistema operativo , discutido aquí , en Windows 7 obtienes un resultado diferente:Entonces, en máquinas Windows, la solución es:
fuente
str_pades ahora mi ir a.str_paddelstringrpaquete es una alternativa.fuente
str_padya que puede conducir a resultados inesperados.i.num = 600000;str_pad(i.num, width = 7, pad = "0")le dará "006e + 05" y no "0600000"Aquí hay una función base R generalizable:
Me gusta
sprintfpero viene con advertencias como:fuente
Aquí hay otra alternativa para agregar los primeros ceros a cadenas como CUSIP que a veces puede parecer un número y que muchas aplicaciones como Excel corromperán y eliminarán los ceros a la izquierda o los convertirán a notación científica.
Cuando probé la respuesta proporcionada por @metasequoia, el vector devuelto tenía espacios iniciales y no
0s. Este fue el mismo problema mencionado por @ user1816679, y eliminar las comillas0o cambiar de%da%stampoco marcó la diferencia. FYI, estoy usando RStudio Server ejecutándose en un servidor Ubuntu. Esta pequeña solución de dos pasos me funcionó:gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))usando la
%>%función de tubería delmagrittrpaquete podría verse así:sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)Prefiero una solución de una función, pero funciona.
fuente
fuente
paste0(0, data$anim)funcionaría bien.Para otras circunstancias en las que desea que la cadena numérica sea coherente, hice una función.
Alguien puede encontrar esto útil:
Perdón por el formato.
fuente