sexta-feira, 23 de março de 2012

Formatando números em R

Um comentário sobre formatação de números na linguagem R, assunto que surgiu em sala outro dia. Quando digitamos uma expressão na linha de comando e concluímos com [], a expressão é repassada automaticamente para a função print(), a qual "imprime" (i.e. mostra na próxima linha do console) o resultado da expressão. Por exemplo, quando digitamos

> sqrt(2)

O que o sistema na verdade executará quando pressionamos a tecla [↵] é o comando...

> print(sqrt(2))

como você pode verificar digitando o segundo comando acima. Um dos argumentos da função print() chama-se digits e serve para especificar quantos dígitos significativos antes e depois da vírgula serão mostrados, no mínimo. Por exemplo, usando a constante pré-determinada pi:

> pi
[1] 3.141593
> print( pi , digits = 3 )
[1] 3.14
> print( 10*pi , digits = 3 )
[1] 31.4

Aliás, digits é uma opção global de sistema e por definição os números são mostrados em R com sete dígitos significativos. (Estou abusando dos espaços entre os argumentos da função para tornar o código mais claro, seguindo o exemplo do John Kruschke. A linguagem R é bastante tolerante com isso.)

É mais comum, no entanto, estarmos interessados em limitar o número de dígitos depois do separador decimal, independentemente do número total de dígitos. A maneira mais simples é arredondar o número usando a função round():

> round( pi, 3 )
[1] 3.142

Outra solução é usar a função format(), com seus argumentos digits (que funciona como na função print() acima) e nsmall. Esse segundo argumento determina o número mínimo de dígitos depois do separador decimal, respeitando o argumento digits. Para esclarecer:

> x <- 1000/7
> x
[1] 142.8571
> format( x , digits = 3 )
[1] "143"
> x
[1] 142.8571

Observe que a função format() arredonda corretamente, não destrói o conteúdo original do objeto formatado e, ao contrário de print() e round(), devolve no modo alfanumérico. Veja agora como os argumentos digits e nsmall se comportam juntos:

> x <- 1000/7
> format( x , digits = 4 )
[1] "142.9"
> format( x , digits = 4 , nsmall = 3 )
[1] "142.857"
> format( x , digits = 4 , nsmall = 12 )
[1] "142.857142857143"
> format( x , digits = 8 , nsmall = 1 )
[1] "142.85714"

Por fim, você pode usar essa função também para mudar o separador decimal de ponto para vírgula:

> format( pi , decimal.mark = "," )
[1] "3,141593"

Existem em R funções de formatação mais flexíveis, que usam especificações de formato no estilo da linguagem C de programação. Se você quiser se aventurar, comece estudando a função formatC()

Nenhum comentário:

Postar um comentário