Formattazione delle posizioni decimali in R


264

Ho un numero, ad esempio 1.128347132904321674821 che vorrei mostrare come solo due cifre decimali durante l'output sullo schermo (o scritto su un file). Come si fa a farlo?

x <- 1.128347132904321674821

MODIFICARE:

L'impiego di:

options(digits=2)

È stata suggerita come possibile risposta. C'è un modo per specificarlo all'interno di uno script per un utilizzo singolo? Quando lo aggiungo al mio script non sembra fare nulla di diverso e non mi interessa molto riscrivere per formattare ogni numero (sto automatizzando un rapporto molto grande).

-

Risposta: rotonda (x, cifre = 2)



Se si usano le opzioni (cifre = 4), ciò non limita i calcoli a 4 cifre, vero? In tal caso, renderebbe i programmi molto meno precisi. Influisce SOLO sul numero quando viene stampato, giusto?
MikeZ,

controls the number of digits to print when printing numeric values. It is a suggestion only. Valid values are 1...22 with default 7. See the note in print.default about values greater than 15.dalle? opzioni ha effetto solo sull'output.
Brandon Bertelsen il

Si noti che round(23, digits=2)stamperà 23e non 23.00. Se vuoi quest'ultimo, prova stackoverflow.com/a/12135122/180892
Jeromy Anglim,

4
@PaulHurleyuk, penso che sia buona prassi in programmazione usare il numero minimo di librerie possibile. Qualcuno che utilizza una libreria diversa per ogni esigenza banale di solito finisce con un casino, file di grandi dimensioni, problemi di portabilità, ecc.
Rodrigo,

Risposte:


381

Contesto: alcune risposte suggerite in questa pagina (ad es. signif, options(digits=...)) Non garantiscono che un determinato numero di decimali venga visualizzato per un numero arbitrario. Presumo che questa sia una caratteristica di progettazione in R in base alla quale una buona pratica scientifica implica la visualizzazione di un certo numero di cifre basato su principi di " cifre significative ". Tuttavia, in molti domini (ad es. Stile APA , rapporti commerciali) i requisiti di formattazione impongono che venga visualizzato un determinato numero di cifre decimali. Ciò viene spesso fatto a fini di coerenza e standardizzazione piuttosto che occuparsi di cifre significative.

Soluzione :

Il codice seguente mostra esattamente due cifre decimali per il numero x.

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

Per esempio:

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"

Una funzione più generale è la seguente in cui xè il numero ed kè il numero di decimali da mostrare. trimwsrimuove qualsiasi spazio bianco iniziale che può essere utile se si dispone di un vettore di numeri.

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

Per esempio,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"

4
+1 L'unica risposta che ha funzionato per me, stampa correttamente 0.0001come0.00
ThomasH il

7
Mi ha sempre infastidito il modo in cui funzionano format()e prettyNum()trasformano i numeri in caratteri. Come lo affronteresti?
Waldir Leoncio,

Cosa c'è tra le virgolette che appaiono?
F.Webber,

2
@JeromyAnglim Prendo atto che la soluzione sopra ha un possibile svantaggio di maiuscole / minuscole di fissare il numero di caratteri davanti al decimale, ad esempio i format(c(10, 1), nsmall=1)rendimenti "10.0" " 1.0"(notare lo spazio iniziale davanti a 1.0. Considerando che la sprintf()funzione sembra garantire una formattazione più piacevole su entrambi i lati del decimale, ad es. sprintf(c(10,1), fmt = '%#.1f')si sbarazza di quel fastidioso spazio di testa e ritorna "10.0" "1.0".
Nicholas G Reich

1
Gli spazi iniziali sono una funzione progettata per allineare il punto decimale quando il risultato di formatviene utilizzato in una colonna.
Abitante

34

Puoi formattare un numero, diciamo x, fino a cifre decimali come desideri. Ecco xun numero con molti decimali. Supponiamo di voler mostrare fino a 8 cifre decimali di questo numero:

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

Qui format="f"fornisce numeri fluttuanti nei soliti decimali diciamo, xxx.xxx, e digitsspecifica il numero di cifre. Al contrario, se si desidera ottenere un numero intero da visualizzare, si utilizzerà format="d"(molto simile sprintf).


Sebbene non sia chiaro esattamente ciò che l'OP stava chiedendo, a giudicare dalla risposta più votata, non ho potuto fare a meno di osservare che formatCè quasi esclusivamente ciò che uso a questo scopo. Penso che questa risposta sia buona ed è nella base R per richiesta del PO.
AdamO,

qualcuno di voi ragazzi potrebbe aiutarmi in questo? stackoverflow.com/q/53279593/5224236
gpier

24

Puoi provare il mio pacchetto formattabile .

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

La cosa buona è che xè ancora un vettore numerico e puoi fare più calcoli con la stessa formattazione.

> x + 1
[1] 2.13

Ancora meglio, le cifre non vanno perse, è possibile riformattare con più cifre in qualsiasi momento :)

> formattable(x, digits = 6, format = "f")
[1] 1.128347

Una piccola puntura che mi infastidisce tutta la mattina. Per qualche ragione R arrotonda il display solo per alcune colonne. Avevo bisogno di questa correzione poiché dovevo anche eseguire calcoli su quelle colonne. Questo funziona Grazie !
thethakuri,

Mi piace formattabile rispetto a qualsiasi funzione baseR. Il più grande vantaggio mantiene la variabile come numerica.
Lazzaro Thurston,

22

per 2 cifre decimali supponendo che si desideri mantenere zeri finali

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

che dà

[1] "5.50"

Come @mpag menziona di seguito, a volte sembra che R possa dare valori imprevisti con questo e il metodo round ad es. Sprintf (5.5550, fmt = '% #. 2f') dà 5,55, non 5,56


1
tuttavia, sebbene gli sprintf arrotondino, sprintf (5.5550, fmt = '% #. 2f') dà un risultato leggermente inaspettato: 5.55. sprintf (5.555000000001, fmt = '% #. 2f') dà 5,56. Questo sembra essere un "problema" generale con arrotondamento in R, poiché il metodo round, nsmall fornisce lo stesso.
mpag,

Grazie @mpag, non avevo idea che R lottasse con l'arrotondamento dei confini, l'ho appena provato con 5.565 che fa arrotondare per eccesso, mentre 5.545 arrotonda per difetto. Immagino sia il modo in cui gestiscono l'precisione in virgola mobile. Non credo di aver visto questo comportamento in altre lingue, suppongo che abbiano una soluzione alternativa
Mark Adamson,

Penso piuttosto che stiano trattando intenzionalmente i valori come limitati nel grado di precisione. Stanno immaginando che un valore che è 5.555 è davvero altrettanto probabile che sia derivato da un valore "reale" di 5,5546 come 5,5554. Tuttavia, se continui quel tipo di rounding game, 5.444445 potrebbe (non testato) finire con "6" se lo fai una cifra alla volta. Ma potresti avere ragione sul fatto che potrebbe trattarsi di una rappresentazione binaria leggermente inferiore o superiore a 5,55.
mpag,

Sì, penso che se fosse intenzionale sarebbe anche coerente tra 5.565 e 5.545. La "casualità" mi suggerisce che è una cosa di rappresentazione in virgola mobile.
Mark Adamson,

qualcuno di voi ragazzi potrebbe aiutarmi in questo? stackoverflow.com/q/53279593/5224236
gpier

8

Qualcosa del genere :

options(digits=2)

Definizione dell'opzione cifre:

digits: controls the number of digits to print when printing numeric values.

C'è un modo per impostarlo in modo dinamico quando si esegue uno script?
Brandon Bertelsen,

Questo funziona per l'output all'interno della console R, ma non funziona nel mio script (escono ancora con .1289273982)
Brandon Bertelsen

1
Ho un comportamento strano, l' digitsopzione non sembra impostare il numero di cifre dopo i decimali. Ad esempio, quando imposto le opzioni (cifre = 2), quindi la stampa di 7,25 produce l'output di 7,2, 1234,25 diventa 1234 e 0,25 rimane 0,25. C'è un'altra opzione che interagisce con questo?
Maxim.K

8

Controlla le funzioni prettyNum, formato

per utilizzare zeri di prova (123.1240 per esempio) sprintf(x, fmt='%#.4g')


@ 42 sprintf
Suggerirei

1
@jangorecki Non sono sicuro del tuo punto. Tutto ciò che ho fatto (5+ anni fa) è stato suggerire una correzione ortografica.
IRTFM,

@ 42 Ti consiglio di lamentarti con l' fmtarg, scusa!
jangorecki,

Penso che l'OP sia dopo cifre decimali fisse anziché cifre fisse. Sembra che la gtua risposta sia per cifre fisse, usando ffunziona meglio.
Mark Adamson,

5

Se preferisci cifre significative a cifre fisse, il comando signif potrebbe essere utile:

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300

1
Grazie Paolo Questi due non erano esattamente quello che stavo cercando, ma signif mi ha portato a round () che è esattamente quello di cui avevo bisogno. Saluti,
Brandon Bertelsen

34
Error: could not find function "fixed"
ThomasH,

signiffunziona per il numero specifico fornito, ma presumo che il problema comune applicato sia quando è necessario mostrare esattamente due cifre decimali ma non si conosce il numero in anticipo. In tal caso, signiffornirà numeri diversi di decimali a seconda del numero effettivo.
Jeromy Anglim,

3
riparato non si trova da nessuna parte. Correggilo, altrimenti questa risposta fuorviante dovrebbe essere eliminata.
HelloWorld,

@JeromyAnglim come lo ripariamo quando vogliamo 3sf? a volte mi dà 3sf, altre volte 4sf, ecc. come possiamo risolvere questo problema?
christouandr7,

4

La funzione formatC()può essere utilizzata per formattare un numero con due cifre decimali. Questa funzione fornisce due cifre decimali anche quando i valori risultanti includono zeri finali.


3

Sto usando questa variante per forzare la stampa dei decimali K:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)

2

Nota che gli oggetti numerici in R sono memorizzati con doppia precisione , il che ti dà (approssimativamente) 16 cifre decimali di precisione - il resto sarà rumore. Concedo che il numero mostrato sopra è probabilmente solo per un esempio, ma è lungo 22 cifre.


3
Confermato, è solo per un esempio. Ho schiacciato la tastiera.
Brandon Bertelsen,

1

Mi sembra che sarebbe qualcosa del genere

library(tutoR)
format(1.128347132904321674821, 2)

Per un piccolo aiuto online .


Ho trovato questo, ma richiede un pacchetto, sto cercando qualcosa all'interno del pacchetto base.
Brandon Bertelsen,

2
@brandon, format () fa parte della base. Aprire R e digitare? Format ... nessun pacchetto necessario.
JD Long

Hmmmm, hai visto cosa produce questo? [1] "1.128347" altrimenti, hai perfettamente ragione sul fatto che sia nel pacchetto di base, mio ​​male.
Brandon Bertelsen il

1
Forse prova format.default(x, digits = 2)solo uno scatto nel buio anche se basato sul link fornito. Quelle informazioni sono alcune delle cose che mancano da ciò che leggo normalmente per la documentazione, mi aspettavo di vedere anche i risultati stampati.
Tim Meers,

Ho appena notato che il tuo link punta alla documentazione tutoR, che non fa parte della base.
Brandon Bertelsen,

1

se vuoi solo arrotondare un numero o un elenco, usa semplicemente

round(data, 2)

Quindi, i dati saranno arrotondati al secondo decimale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.