Formatowanie miejsc dziesiętnych w R

Mam numer, na przykład 1.128347132904321674821, który chciałbym pokazać jako tylko dwa miejsca po przecinku podczas wyświetlania na ekranie (lub zapisu do pliku). Jak to się robi?

x <- 1.128347132904321674821

EDIT:

Użycie:

options(digits=2)

Została zasugerowana jako możliwa odpowiedź. Czy istnieje sposób, aby określić to w skrypcie do jednorazowego użytku? Kiedy dodaję go do skryptu to nie robi nic innego i nie interesuje mnie wiele przepisywania, aby sformatować każdy numer (jestem automatyzacja bardzo dużego raportu).

--

Odpowiedź: round( x, cyfry=2)

Author: epo3, 2010-08-09

12 answers

Background: niektóre odpowiedzi sugerowane na tej stronie (np., signif, options(digits=...)) nie gwarantuj, że określona liczba miejsc po przecinku jest wyświetlana dla dowolnej liczby. Zakładam, że jest to cecha konstrukcyjna w R, w której dobra praktyka naukowa polega na pokazaniu pewnej liczby cyfr w oparciu o zasady "znaczące liczby ". Jednak w wielu dziedzinach (np. APA style, raporty biznesowe) wymagania formatowania dyktują, że pewna liczba dziesiętnych wyświetlane są miejsca. Często robi się to dla celów spójności i standaryzacji, a nie dla znaczących danych liczbowych.

Rozwiązanie :

Poniższy kod pokazuje dokładnie dwa miejsca po przecinku dla liczby x.

format(round(x, 2), nsmall = 2)

Na przykład:

format(round(1.20, 2), nsmall = 2)
# [1] "1.20"
format(round(1, 2), nsmall = 2)
# [1] "1.00"
format(round(1.1234, 2), nsmall = 2)
# [1] "1.12"

Bardziej ogólna funkcja jest następująca, gdzie x jest liczbą, a k jest liczbą dziesiętną do pokazania. trimws usuwa wszystkie wiodące białe spacje, które mogą być przydatne, jeśli masz wektor liczb.

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))

Np.,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
 291
Author: Jeromy Anglim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-02 01:51:36

Możesz sformatować liczbę, powiedzmy x, do miejsc po przecinku, jak chcesz. Tutaj x jest liczbą z wieloma miejscami po przecinku. Załóżmy, że chcemy pokazać do 8 miejsc po przecinku tej liczby:

x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"

Tutaj format="f" podaje liczby zmiennoprzecinkowe w zwykłych miejscach po przecinku powiedzmy, xxx. xxx, A digits określa liczbę cyfr. Dla kontrastu, jeśli chcesz uzyskać liczbę całkowitą do wyświetlenia, użyj format="d" (podobnie jak sprintf).

 23
Author: SORIF HOSSAIN SHUJON,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 00:10:31

Możesz wypróbować mój pakiet formatowalny .

> # devtools::install_github("renkun-ken/formattable")
> library(formattable)
> x <- formattable(1.128347132904321674821, digits = 2, format = "f")
> x
[1] 1.13

Dobrą rzeczą jest to, że x jest nadal wektorem liczbowym i możesz wykonać więcej obliczeń z tym samym formatowaniem.

> x + 1
[1] 2.13

Nawet lepiej, cyfry nie są tracone, można sformatować więcej cyfr w dowolnym momencie:)

> formattable(x, digits = 6, format = "f")
[1] 1.128347
 14
Author: Kun Ren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-29 08:09:04

Dla 2 miejsc po przecinku przy założeniu, że chcesz zachować końcowe zera

sprintf(5.5, fmt = '%#.2f')

Co daje

[1] "5.50"

Jak @mpag wspomina poniżej, wydaje się, że R może czasami podać nieoczekiwane wartości za pomocą tej i metody okrągłej, np. sprintf(5.5550, fmt='%#.2f") daje 5.55, a nie 5.56

 7
Author: Mark Adamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-24 21:34:44

Sprawdź funkcje prettyNum, format

Aby mieć testujące zera (na przykład 123.1240) użyj sprintf(x, fmt='%#.4g')

 5
Author: ilya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-27 16:16:12

Coś w tym stylu:

options(digits=2)

Definicja opcji cyfr:

digits: controls the number of digits to print when printing numeric values.
 4
Author: Xavier V.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 20:04:28

Cóż, te dwa, które przychodzą mi na myśl to

fixed(1.128347132904321674821, digits=2)

Lub jeśli wolisz cyfry siginificant od stałych cyfr to;

signif(1.128347132904321674821,digits=3)
 4
Author: PaulHurleyuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-09 20:31:40

Funkcja formatC() może być używana do formatowania liczby do dwóch miejsc po przecinku. Dwa miejsca po przecinku są podane przez tę funkcję nawet wtedy, gdy wartości wynikowe zawierają końcowe zera.

 3
Author: Chernoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-26 21:13:16

Zauważ, że obiekty liczbowe w R są przechowywane z podwójną precyzją , co daje (w przybliżeniu) 16 cyfr dziesiętnych precyzji - reszta będzie szumem. Przyznam, że liczba pokazana powyżej jest prawdopodobnie tylko dla przykładu, ale ma 22 cyfry.

 2
Author: nullglob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-10 05:01:06

Używam tego wariantu do wymuszonego drukowania K miejsc dziesiętnych:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
 2
Author: Eldar Agalarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-14 03:30:07

Wygląda mi na coś w rodzaju

library(tutoR)
format(1.128347132904321674821, 2)

Za małą Pomoc online .

 1
Author: Tim Meers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-07 04:54:37

Jeśli chcesz zaokrąglać liczbę lub listę, po prostu użyj

round(data, 2)

Wtedy dane będą zaokrąglone do 2 miejsca po przecinku.

 0
Author: jared,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-05 04:04:46