Czy zmusić R, aby nie używał notacji wykładniczej (np. E + 10)?


228

Czy mogę zmusić R do używania zwykłych liczb zamiast używania e+10podobnej notacji? Mam:

1.810032e+09
# and 
4

w tym samym wektorze i chcesz zobaczyć:

1810032000
# and
4

Tworzę dane wyjściowe dla staroświeckiego programu i muszę napisać plik tekstowy przy użyciu cat. Do tej pory działa dobrze, ale po prostu nie mogę tam użyć e+10zapisu.


Odpowiedzi:


228

To jest trochę szary obszar. Musisz pamiętać, że R zawsze wywołuje metodę drukowania, a te metody drukowania słuchają niektórych opcji. W tym „scipen” - kara za pokaz naukowy. Od help(options):

„scipen”: liczba całkowita. Kara stosowana przy podejmowaniu decyzji o drukowaniu wartości liczbowych w notacji stałej lub wykładniczej. Odchylenie wartości dodatnich w kierunku stałego i ujemne w stosunku do notacji naukowej: stała notacja będzie preferowana, chyba że będzie szersza niż cyfry „scipen”.

Przykład:

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

To powiedziawszy, nadal uważam to za godne uwagi. Najbardziej bezpośrednim sposobem jest użycie sprintf()z wyraźną szerokością np sprintf("%.5f", ran2).


1
Dzięki. Scipen wydaje się być opcją, której szukałem. Upiorne wyjaśnienie dotyczące kary sprawiło, że się odsunąłem. Ale twój przykład to ładnie wyjaśnia. sprintf, co? czy masz na myśli kłopoty z sprintfem tydzień temu? :)
Matt Bannert

4
W rstudio, jeśli zaimportujesz zestaw danych i wykonasz format train_sample_10k = (train_sample_10k, Scientific = FALSE) i przeładujesz, zmieni to notacje naukowe.
mixdev

Jak przywrócić normalność po wykonaniu tej czynności?
AIM_BLB

6
@CSA: options("scipen"=0, "digits"=7)(są to wartości domyślne)
Scarabee

Powinieneś przenieść ten, który osiąga wynik options("scipen"=100, "digits"=4)na górę kodu, i ten, który nie znajduje się poniżej ... z odpowiednimi notatkami. Może to być mylące dla kogoś, kto szuka szybkiego rozwiązania (a Google pokazuje w rezultacie pierwsze).
xbsd

152

Można to osiągnąć, wyłączając notację naukową w R.

options(scipen = 999)

4
Ponadto można to umieścić w pliku .Rprofile, aby domyślnie był automatycznie wykonywany.
smci

74

Moja ulubiona odpowiedź:

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

To daje to, czego chcesz, bez konieczności grzebania w ustawieniach R.

Zauważ, że zwraca ciąg znaków zamiast obiektu liczbowego


1
Hm, to dziwne, to nie działa dla mnie. Nie dostaję błędu, po prostu nadal drukuje zapis naukowy.
Ovi

Nie jestem pewien, co może być nie tak. Sprawdziłem bardzo starą (3.1.0) i nową (3.4.3) wersję R i działa ona dla mnie w obu. Najprawdopodobniej jakieś inne ustawienie gdzieś ma pierwszeństwo lub znalazłeś błąd specyficzny dla danej wersji lub błąd krawędzi w R. Czy to możliwe, że podajesz mu ciąg znaków w notacji naukowej zamiast obiektu numerycznego? To by to wyjaśniało.
Danny

10
Być może warto zauważyć, że tworzy to znak zamiast liczby.
cengel

3
Jeśli liczby w wektorze mają różne długości, upewnij się, że je wykorzystasz, w justified = "none"przeciwnym razie będą spacje wypełniające je na tej samej długości.
Lauren Fitch,

1
format(1e6, scientific=FALSE)zwraca "1000000"podczas as.character(1e6)powrotu "1e+06", więc istnieje różnica między tymi dwiema metodami.
mickey,

7

Umieścić options(scipen = 999) w pliku .Rprofile więc robi automatycznie wykonywana domyślnie . (Nie polegaj na robieniu tego ręcznie).

(To mówi coś innego niż inne odpowiedzi: jak?

  1. Utrzymuje to przy zdrowych zmysłach, gdy przebijasz się między wieloma projektami, wieloma językami codziennie lub co miesiąc. Pamiętanie o wpisaniu ustawień dla poszczególnych projektów jest podatne na błędy i nie jest skalowalne. Możesz mieć globalny ~ / .Rprofile lub dla projektu .Rprofile. Lub oba, przy czym ten drugi ma pierwszeństwo przed pierwszym.
  2. Przechowywanie całej konfiguracji w całym projekcie lub globalnie .Rprofile wykonuje ją automatycznie. Jest to przydatne np. W przypadku domyślnych ładowań pakietów, konfiguracji tabeli danych, środowiska itp. Ponownie, ta konfiguracja może zostać uruchomiona na stronie ustawień i nie ma szans, że zapamiętasz je i ich składnię i wpiszesz je

Dlaczego dokładnie ta sama odpowiedź? stackoverflow.com/a/27318351/680068 Oprócz bitu Rprofile, może lepiej edytować odpowiedź GingerJacka?
zx8754

@ zx8754: to nie jest dokładnie ta sama odpowiedź: kluczowym punktem jest przeniesienie tych rzeczy do twojego .Rprofile. Wtedy nigdy nie możesz tego zapomnieć. Ponadto, w miarę upływu czasu .Rprofile gromadzi wszystkie dostosowania.
smci

1
Oczywiście do ciebie, ale Q nie brzmi „jak mogę nie zapomnieć zrobić X”, ale „jak mogę zrobić X”.
zx8754

@ zx8754: Thunk między R i Python / pandami w wielu projektach dziennie. Oba mają dostosowania, ścieżki pakietów itp. Naprawdę rozsądnie jest mieć jeden wspólny plik konfiguracyjny, który je przechowuje. Przez projekty.
smci

1
@ zx8754: kiedy pracujesz nad wieloma projektami w wielu językach, pytanie „jak mogę zrobić X” łączy się z „jak nie mogę zapomnieć o zrobieniu X” w skalowalny, spójny, automatyczny sposób. Właśnie dodałem więcej wyjaśnień. Dla każdego, kto jest przejeżdżającym downvoter.
smci
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.