Forcer R à ne pas utiliser la notation exponentielle (par exemple e + 10)?

229

Puis-je forcer R à utiliser des nombres réguliers au lieu d'utiliser la e+10notation de type? J'ai:

1.810032e+09
# and 
4

dans le même vecteur et veulent voir:

1810032000
# and
4

Je crée une sortie pour un programme à l'ancienne et je dois écrire un fichier texte en utilisant cat. Cela fonctionne bien jusqu'à présent, mais je ne peux tout simplement pas utiliser la e+10notation ici.

Matt Bannert
la source
EN RELATION
Richie Cotton

Réponses:

228

C'est un peu une zone grise. Vous devez vous rappeler que R invoquera toujours une méthode d'impression et ces méthodes d'impression écoutent certaines options. Y compris «scipen» - une pénalité pour affichage scientifique. De help(options):

'scipen': entier. Une pénalité à appliquer lors de la décision d'imprimer des valeurs numériques en notation fixe ou exponentielle. Les valeurs positives biaisent vers la notation fixe et négative vers la notation scientifique: la notation fixe sera préférée à moins qu'elle ne soit plus large que les chiffres «scipen».

Exemple:

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

Cela dit, je le trouve toujours fiable. La façon la plus directe est d'utiliser sprintf()avec une largeur explicite, par exemple sprintf("%.5f", ran2).

Dirk Eddelbuettel
la source
1
Merci. scipen semble être l'option que je cherchais. L'explication de la pénalité effrayante m'a fait fuir. Mais votre exemple l'explique bien. sprintf, hein? parlez-vous des problèmes que j'ai rencontrés avec sprintf il y a une semaine? :)
Matt Bannert
4
Dans rstudio, si vous importez un jeu de données et faites le format train_sample_10k = (train_sample_10k, scientific = FALSE) et rechargez, cela changera les notations scientifiques.
mixdev
Comment puis-je remettre les choses à la normale après avoir fait cela?
AIM_BLB
6
@CSA: options("scipen"=0, "digits"=7)(ce sont les valeurs par défaut)
Scarabee
Vous devez déplacer celui qui obtient le résultat options("scipen"=100, "digits"=4)en haut du code, et celui qui ne le fait pas en dessous ... avec les notes appropriées. Cela peut être déroutant pour quelqu'un qui cherche une solution rapide (et Google montre le premier comme résultat).
xbsd
152

Il peut être atteint en désactivant la notation scientifique dans R.

options(scipen = 999)
GingerJack
la source
4
De plus, cela peut être placé dans votre fichier .Rprofile afin qu'il soit automatiquement exécuté par défaut.
smci
75

Ma réponse préférée:

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

Cela donne ce que vous voulez sans avoir à fouiner dans les paramètres R.

Notez qu'il renvoie une chaîne de caractères plutôt qu'un objet numérique

Danny
la source
1
Hm c'est bizarre, ça ne marche pas pour moi. Je n'ai pas d'erreur, il imprime toujours la notation scientifique.
Ovi
Je ne sais pas ce qui pourrait mal. J'ai vérifié une très ancienne (3.1.0) et une nouvelle (3.4.3) version de R et cela fonctionne pour moi dans les deux. Très probablement, un autre paramètre quelque part est prioritaire ou vous avez trouvé un bogue spécifique à la version ou un casse de bord dans R. Est-il possible que vous lui fournissiez une chaîne en notation scientifique plutôt qu'un objet numérique? Cela expliquerait cela.
Danny
10
Peut-être à noter que cela crée un caractère au lieu d'un nombre.
cengel
3
Si les nombres dans votre vecteur sont de longueurs variables, assurez-vous de les utiliser, justified = "none"sinon il y aura des espaces les remplissant à la même longueur.
Lauren Fitch
1
format(1e6, scientific=FALSE)renvoie "1000000"tandis que as.character(1e6)renvoie "1e+06", il y a donc une différence entre les deux méthodes.
mickey
7

Placez options(scipen = 999) votre fichier .Rprofile pour qu'il soit automatiquement exécuté par défaut . (Ne comptez pas sur le faire manuellement.)

(Cela signifie quelque chose de différent des autres réponses: comment?

  1. Cela garde les choses saines lorsque vous réfléchissez entre plusieurs projets, plusieurs langues sur une base quotidienne ou mensuelle. N'oubliez pas de taper vos paramètres par projet est source d'erreurs et non évolutif. Vous pouvez avoir un ~ / .Rprofile global ou un .Rprofile par projet. Ou les deux, le dernier l'emportant sur le premier.
  2. Conserver toute votre configuration dans un projet .Rprofile global ou à l'échelle du projet l'exécute automatiquement. Ceci est utile par exemple pour les charges de paquets par défaut, la configuration de data.table, l'environnement etc.
smci
la source
Pourquoi exactement la même réponse? stackoverflow.com/a/27318351/680068 Mis à part le bit Rprofile, peut-être mieux éditer la réponse du GingerJack?
zx8754
@ zx8754: ce n'est pas exactement la même réponse: le point crucial est de déplacer ce truc dans votre .Rprofile. Ensuite, vous ne pouvez jamais l'oublier. De plus, au fil du temps, votre .Rprofile accumule toutes vos personnalisations.
smci
1
À vous bien sûr, mais le Q n'est pas "comment puis-je ne pas oublier de faire X" mais "comment puis-je faire X".
zx8754
@ zx8754: Je pense quotidiennement entre R et Python / pandas sur plusieurs projets. Les deux ont des personnalisations, des chemins de package, etc. Cela garde vraiment les choses saines d'avoir un fichier de configuration commun les stockant. À travers des projets.
smci
1
@ zx8754: lorsque vous travaillez sur plusieurs projets dans plusieurs langues, la question "comment puis-je faire X" se confond avec "comment ne pas oublier de faire X", de manière évolutive, cohérente et automatique. J'ai juste ajouté plus d'explications. Pour qui est le downvoter en voiture.
smci