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
formatC
osprintf
.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,paste0
es 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_pad
fromstringr
funciona 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_pad
enstringi
trabajos exactamente comostr_pad
destringr
.formatC
es 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 elwidth
argumento, queformat
es"d"
para "entero" y a"0"
flag
para 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.
sprintf
es una interfaz para la función C del mismo nombre; comoformatC
pero con una sintaxis diferente.La principal ventaja de
sprintf
es 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.prettyNum
es otra función de formato, principalmente para crear etiquetas de marca de eje manuales. Funciona particularmente bien para amplios rangos de números.El
scales
paquete tiene varias funciones comopercent
,date_format
ydollar
para tipos de formatos especializados.fuente
flag = "0"
.?sprintf
pá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 lasprintf
función. Funciona así:En tu caso, probablemente quieras:
data$anim <- sprintf("%06d", data$anim)
fuente
sprintf
convierte 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_pad
es ahora mi ir a.str_pad
delstringr
paquete es una alternativa.fuente
str_pad
ya 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
sprintf
pero 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
0
s. Este fue el mismo problema mencionado por @ user1816679, y eliminar las comillas0
o cambiar de%d
a%s
tampoco 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 delmagrittr
paquete 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