Formatando casas decimais em R

Eu tenho um número, por exemplo, 1.128347132904321674821 que gostaria de mostrar como apenas duas casas decimais quando a saída para a canvas (ou escrita em um arquivo). Como é que alguém faz isso?

x <- 1.128347132904321674821 

EDITAR:

O uso de:

 options(digits=2) 

Foi sugerido como uma possível resposta. Existe uma maneira de especificar isso dentro de um script para uso único? Quando o adiciono ao meu script, ele não parece fazer nada diferente e não estou interessado em muita digitação para formatar cada número (estou automatizando um relatório muito grande).

Resposta: redondo (x, dígitos = 2)

Antecedentes: Algumas respostas sugeridas nesta página (por exemplo, signif , options(digits=...) ) não garantem que um determinado número de decimais seja exibido para um número arbitrário. Suponho que isso seja uma característica do projeto em R, em que a boa prática científica envolve mostrar um certo número de dígitos com base nos princípios de ” figuras significativas “. No entanto, em muitos domínios (por exemplo, estilo APA , relatórios de negócios), os requisitos de formatação determinam que um determinado número de casas decimais seja exibido. Isso geralmente é feito para fins de consistência e padronização, em vez de se preocupar com números significativos.

Solução :

O código a seguir mostra exatamente duas casas decimais para o número x .

 format(round(x, 2), nsmall = 2) 

Por exemplo:

 format(round(1.20, 2), nsmall = 2) # [1] "1.20" format(round(1, 2), nsmall = 2) # [1] "1.00" format(round(1.1234, 2), nsmall = 2) # [1] "1.12" 

Uma function mais geral é a seguinte, onde x é o número k é o número de decimais a mostrar. trimws remove qualquer espaço em branco inicial que possa ser útil se você tiver um vetor de números.

 specify_decimal < - function(x, k) trimws(format(round(x, k), nsmall=k)) 

Por exemplo,

 specify_decimal(1234, 5) # [1] "1234.00000" specify_decimal(0.1234, 5) # [1] "0.12340" 

Você pode formatar um número, digamos x , até casas decimais, como desejar. Aqui x é um número com muitas casas decimais. Suponha que desejamos mostrar até 8 casas decimais deste número:

 x = 1111111234.6547389758965789345 y = formatC(x, digits = 8, format = "f") # [1] "1111111234.65473890" 

Aqui format="f" fornece números flutuantes nas casas decimais usuais digamos, xxx.xxx e digits especifica o número de dígitos. Por outro lado, se você quisesse exibir um número inteiro, usaria format="d" (parecido com sprintf ).

Você pode tentar meu pacote formattable .

 > # devtools::install_github("renkun-ken/formattable") > library(formattable) > x < - formattable(1.128347132904321674821, digits = 2, format = "f") > x [1] 1.13 

O bom é que x ainda é um vetor numérico e você pode fazer mais cálculos com a mesma formatação.

 > x + 1 [1] 2.13 

Melhor ainda, os dígitos não estão perdidos, você pode reformatar com mais dígitos a qualquer momento 🙂

 > formattable(x, digits = 6, format = "f") [1] 1.128347 

por 2 casas decimais, assumindo que você deseja manter zeros à direita

 sprintf(5.5, fmt = '%#.2f') 

que dá

 [1] "5.50" 

Como @mpag menciona abaixo, parece que R às vezes pode dar valores inesperados com isso e o método round eg sprintf (5.5550, fmt = ‘% # .2f’) fornece 5.55, não 5.56

Verifique as funções prettyNum, format

para ter zeros de teste (123.1240 por exemplo) use sprintf(x, fmt='%#.4g')

Algo parecido :

 options(digits=2) 

Definição da opção de dígitos:

 digits: controls the number of digits to print when printing numeric values. 

Bem, os dois que vêm à mente são

 fixed(1.128347132904321674821, digits=2) 

ou se você preferir dígitos significativos a dígitos fixos então;

 signif(1.128347132904321674821,digits=3) 

A function formatC() pode ser usada para formatar um número em duas casas decimais. Duas casas decimais são dadas por esta function, mesmo quando os valores resultantes incluem zeros à direita.

Note que os objects numéricos em R são armazenados com precisão dupla , o que lhe dá (aproximadamente) 16 dígitos decimais de precisão – o resto será ruído. Eu admito que o número mostrado acima é provavelmente apenas para um exemplo, mas tem 22 dígitos.

Estou usando essa variante para casas decimais com impressão forçada K:

 # format numeric value to K decimal places formatDecimal < - function(x, k) format(round(x, k), trim=T, nsmall=k) 

Parece-me que seria algo como

 library(tutoR) format(1.128347132904321674821, 2) 

Por um pouco de ajuda online .

se você quiser apenas arredondar um número ou uma lista, simplesmente use

 round(data, 2) 

Em seguida, os dados serão arredondados para duas casas decimais.