Forçar R a não usar notação exponencial (por exemplo, e + 10)?


228

Posso forçar R a usar números regulares em vez de usar a e+10notação-like? Eu tenho:

1.810032e+09
# and 
4

dentro do mesmo vetor e deseja ver:

1810032000
# and
4

Estou criando saída para um programa antiquado e preciso escrever um arquivo de texto usando cat. Isso funciona bem até agora, mas simplesmente não posso usar a e+10notação lá.


Respostas:


228

Esta é uma área um pouco cinzenta. Você precisa lembrar que R sempre chamará um método de impressão, e esses métodos de impressão escutam algumas opções. Incluindo 'scipen' - uma penalidade para exibição científica. De help(options):

'scipen': inteiro. Uma penalidade a ser aplicada ao decidir imprimir valores numéricos em notação fixa ou exponencial. Valores positivos enviesam-se para notação científica fixa e negativa para notação científica: a notação fixa será preferida, a menos que seja mais do que dígitos 'scipen' mais largos.

Exemplo:

R> ran2 <- c(1.810032e+09, 4) 
R> options("scipen"=-100, "digits"=4)
R> ran2
[1] 1.81e+09 4.00e+00
R> options("scipen"=100, "digits"=4)
R> ran2
[1] 1810032000          4

Dito isto, ainda acho que vale a pena. A maneira mais direta é usar sprintf()com largura explícita, por exemplo sprintf("%.5f", ran2).


1
Obrigado. scipen parece ser a opção que eu estava procurando. A explicação da penalidade assustadora me deixou envergonhado. Mas o seu exemplo explica isso muito bem. sprintf, hein? você está se referindo aos problemas com o sprintf há uma semana? :)
— Matt Bannert,

4
No rstudio, se você importar um conjunto de dados e fizer train_sample_10k = format (train_sample_10k, scientific = FALSE) e recarregar, ele mudará as notações científicas.
— mixdev

Como faço para retornar as coisas ao normal depois de ter feito isso?
— AIM_BLB

6
@CSA: options("scipen"=0, "digits"=7)(esses são os valores padrão)
— Scarabee

Você deve mover o que alcança o resultado options("scipen"=100, "digits"=4)para o topo do código e o que não fica abaixo dele ... com as notas apropriadas. Pode ser confuso para quem está procurando uma solução rápida (e o Google mostra a primeira como resultado).
— xbsd 11/02/19

152

Isso pode ser alcançado desativando a notação científica em R.

options(scipen = 999)

4
Além disso, isso pode ser colocado no seu arquivo .Rprofile para que seja executado automaticamente por padrão.
— smci

74

Minha resposta favorita:

format(1810032000, scientific = FALSE)
# [1] "1810032000"

Isso dá o que você deseja, sem ter que se preocupar com as configurações de R.

Observe que ele retorna uma cadeia de caracteres em vez de um objeto numérico


1
Hum, isso é estranho, não funciona para mim. Não recebo um erro, ele ainda imprime notação científica.
— Ovi

Não tenho certeza do que poderia estar errado. Fiz o check-in de uma versão muito antiga (3.1.0) e nova (3.4.3) do R e funciona para mim em ambos. Provavelmente, alguma outra configuração em algum lugar está tendo precedência ou você encontrou uma versão específica ou um erro de maiúscula na R. É possível que você esteja alimentando uma string em notação científica em vez de um objeto numérico? Isso explicaria isso.
— Danny

10
Talvez digno de nota que isso cria um personagem em vez de um número.
— Cengel 26/0318

3
Se os números em seu vetor tiverem comprimentos variados, certifique-se de usar, justified = "none"ou haverá espaços preenchendo-os no mesmo comprimento.
— Lauren Fitch

1
format(1e6, scientific=FALSE)retorna "1000000"enquanto as.character(1e6)retorna "1e+06", então há uma diferença entre os dois métodos.
— mickey

7

Coloque options(scipen = 999) no seu arquivo .Rprofile para que seja executado automaticamente por padrão . (Não confie em fazê-lo manualmente.)

(Isso está dizendo algo diferente de outras respostas: como?

  1. Isso mantém as coisas sãs quando você realiza a conversão entre vários projetos e vários idiomas diariamente ou mensalmente. Lembrar de digitar as configurações por projeto é passível de erros e não é escalável. Você pode ter um perfil global ~ / .Rprofile ou por projeto. Ou ambos, com o último substituindo o primeiro.
  2. Manter toda a sua configuração em um .Rprofile global ou em todo o projeto, executa automaticamente. Isso é útil para, por exemplo, o carregamento padrão de pacotes, a configuração da tabela de dados, o ambiente etc. Mais uma vez, essa configuração pode ser executada em uma página de configurações, e não há nenhuma chance de você lembrar essas e suas sintaxes e digitá-las em

Por que exatamente a mesma resposta? stackoverflow.com/a/27318351/680068 Além do bit Rprofile, talvez seja melhor editar a resposta do GingerJack?
— Zx8754

@ zx8754: não é exatamente a mesma resposta: o ponto crucial é mover essas coisas para o seu perfil. Então você nunca pode esquecê-lo. Além disso, com o passar do tempo, o seu .Rprofile acumula todas as suas personalizações.
— SMCI

1
Depende de você, é claro, mas o Q não é "como não posso esquecer o X", mas "como posso fazer o X".
— Zx8754

@ zx8754: Eu penso entre R e Python / pandas em vários projetos diariamente. Ambos têm personalizações, caminhos de pacotes, etc. Isso realmente mantém as coisas saudáveis ​​por ter um arquivo de configuração comum armazenando-os. Entre projetos.
— smci

1
@ zx8754: quando você está trabalhando em vários projetos em vários idiomas, a pergunta "como posso fazer o X" se funde com "como não posso esquecer de fazer o X", de uma maneira escalável, consistente e automática. Acabei de adicionar mais explicações. Para quem é o downvoter drive-by.
— SMCI
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.