¿Cómo agregar ceros iniciales?



4 Answers

Para una solución general que funcione sin importar cuántos dígitos estén en data$anim , use la función sprintf . Funciona así:

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

En su caso, probablemente desee: data$anim <- sprintf("%06d", data$anim)

r formatting number-formatting r-faq

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 añadir un cero antes de cada ID 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 el bien de los intereses, ¿qué sucede si necesito agregar dos o tres ceros antes de la identificación del animal?




str_pad del paquete stringr es una alternativa.

anim = 25499:25504
str_pad(anim, width=6, pad="0")



Aquí hay otra alternativa para agregar el encabezado a 0 en cadenas como CUSIPs que a veces puede parecer un número y que muchas aplicaciones como Excel corromperán y eliminarán los 0 iniciales 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 comillas alrededor del 0 o cambiar de %d a %s tampoco hizo una diferencia. Para su información, estoy usando RStudio Server ejecutándose en un servidor Ubuntu. Esta pequeña solución de dos pasos funcionó para mí:

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

usando la función %>% pipe del paquete magrittr podría verse así:

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

Prefiero una solución de una función, pero funciona.




Para otras circunstancias en las que desea que la cadena numérica sea consistente, hice una función.

Alguien puede encontrar esto útil:

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)

Lo siento por el formato.




Related