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