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á.

Matt Bannert
fonte
Veja também: stackoverflow.com/q/3978266/134830
Richie Cotton

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).

Dirk Eddelbuettel
fonte
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)
GingerJack
fonte
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

Danny
fonte
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
smci
fonte
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