Eu tenho um conjunto de dados que se parece com isso:
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
Eu gostaria que um zero fosse adicionado 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
E pelo interesse, e se eu precisar adicionar dois ou três zeros antes da identificação do animal?
data$anim = paste(rep(0, n), data$anim, sep = "")
Respostas:
A versão curta: use
formatC
ousprintf
.A versão mais longa:
Existem várias funções disponíveis para formatar números, incluindo a adição de zeros à esquerda. Qual é o melhor depende de qual outra formatação você deseja fazer.
O exemplo da pergunta é bastante fácil, já que todos os valores têm o mesmo número de dígitos, portanto, vamos tentar um exemplo mais difícil de criar potências de 10 de largura 8 também.
paste
(e sua variantepaste0
) geralmente são as primeiras funções de manipulação de strings que você encontra. Eles não são realmente projetados para manipular números, mas podem ser usados para isso. No caso simples, em que sempre precisamos acrescentar um único zero,paste0
é a melhor solução.No caso em que há um número variável de dígitos nos números, é necessário calcular manualmente quantos zeros devem ser acrescentados, o que é horrível o suficiente para que você deva fazê-lo apenas por curiosidade mórbida.
str_pad
destringr
obras de forma semelhante apaste
, tornando-a mais explícita que você quer coisas almofada.Novamente, ele não foi realmente projetado para uso com números, portanto, o caso mais difícil exige um pouco de reflexão. Deveríamos apenas poder dizer "almofada com zeros na largura 8", mas veja esta saída:
Você precisa definir a opção de penalidade científica para que os números sejam sempre formatados usando notação fixa (em vez de notação científica).
stri_pad
emstringi
obras exatamente comostr_pad
destringr
.formatC
é uma interface para a função Cprintf
. Usá-lo requer algum conhecimento dos arcanos dessa função subjacente (consulte o link). Nesse caso, os pontos importantes são owidth
argumento,format
sendo"d"
para "número inteiro" e um"0"
flag
para preceder zeros.Esta é a minha solução favorita, pois é fácil mexer na alteração da largura e a função é poderosa o suficiente para fazer outras alterações na formatação.
sprintf
é uma interface para a função C com o mesmo nome; comoformatC
, mas com uma sintaxe diferente.A principal vantagem
sprintf
é que você pode incorporar números formatados em bits de texto mais longos.Veja também a resposta da mercadoria .
Para completar, vale a pena mencionar as outras funções de formatação que são úteis ocasionalmente, mas não têm método de preceder zeros.
format
, uma função genérica para formatar qualquer tipo de objeto, com um método para números. Funciona um pouco comoformatC
, mas com outra interface.prettyNum
é mais uma função de formatação, principalmente para a criação de rótulos de marcação de eixo manuais. Funciona particularmente bem para amplas faixas de números.O
scales
pacote possui várias funções, comopercent
,date_format
edollar
para tipos de formato especializados.fonte
flag = "0"
.?sprintf
página de ajuda descreve isso. "mn: dois números separados por um ponto, indicando a largura do campo (m) e a precisão (n)."Para uma solução geral que funcione independentemente de quantos dígitos estejam
data$anim
, use asprintf
função Funciona assim:No seu caso, você provavelmente quer:
data$anim <- sprintf("%06d", data$anim)
fonte
sprintf
converte numérico em sequência (caractere).Expandindo a repsonse da @ goodside:
Em alguns casos, convém preencher uma string com zeros (por exemplo, códigos de fips ou outros fatores numéricos). No OSX / Linux:
Mas como
sprintf()
chama osprintf()
comando C do sistema operacional , discutido aqui , no Windows 7, você obtém um resultado diferente:Portanto, em máquinas Windows, a solução é:
fonte
str_pad
agora é minha vez.str_pad
dostringr
pacote é uma alternativa.fonte
str_pad
, pois pode levar a resultados inesperados.i.num = 600000
;str_pad(i.num, width = 7, pad = "0")
lhe dará "006e + 05" e não "0600000"Aqui está uma função R generalizável de base:
Eu gosto,
sprintf
mas ele vem com advertências como:fonte
Aqui está outra alternativa para adicionar os 0s iniciais às seqüências de caracteres, como CUSIPs, que às vezes podem parecer um número e que muitos aplicativos, como o Excel, corromperão e removerão os 0s principais ou os converterão em notação científica.
Quando tentei a resposta fornecida pelo @metasequoia, o vetor retornado tinha espaços à esquerda e não
0
s. Esse foi o mesmo problema mencionado por @ user1816679 - remover as aspas ao redor0
ou mudar de%d
para%s
também não fez diferença. Para sua informação, estou usando o RStudio Server em execução no Ubuntu Server. Esta pequena solução em duas etapas funcionou para mim:gsub(pattern = " ", replacement = "0", x = sprintf(fmt = "%09s", ids[,CUSIP]))
usando a
%>%
função pipe damagrittr
embalagem, ele pode ficar assim:sprintf(fmt = "%09s", ids[,CUSIP]) %>% gsub(pattern = " ", replacement = "0", x = .)
Eu preferiria uma solução de função única, mas funciona.
fonte
fonte
paste0(0, data$anim)
funcionaria bem.Para outras circunstâncias em que você deseja que a sequência numérica seja consistente, criei uma função.
Alguém pode achar isso útil:
Desculpe a formatação.
fonte