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.