2010-07-14 14 views
14

voglio formattare i numeri nei miei rapporti di significant digits, ma tenere finali zeri significativi e formattare correttamente un gran numeronumeri FORMAT per cifre significative bene in R

Per esempio i numeri c (10.00001,12345,1234.5,123.45, 1.2345,0.12345) a 3 cifre significative dovrebbero essere 10,0, 12300, 1230, 123, 1.23, 0.123 ma ottengo diversi risultati con metodi diversi (e nessuno sembra funzionare universaly.

> numbers<-c(10.00001,12345,1234.5,123.45,1.2345,0.12345) 
> for(n in seq(numbers)){ 
+ print(signif(numbers[n],digits=3)) 
+ print(format(numbers[n],digits=3)) 
+ print(formatC(numbers[n], digits=3,format="fg")) 
+ print(formatC(numbers[n], digits=3,format="fg", flag="#")) 
+ } 
[1] 10 
[1] "10" 
[1] " 10" 
[1] "10.0" 
[1] 12300 
[1] "12345" 
[1] "12345" 
[1] "12345." 
[1] 1230 
[1] "1234" 
[1] "1234" 
[1] "1234." 
[1] 123 
[1] "123" 
[1] " 123" 
[1] "123." 
[1] 12.3 
[1] "12.3" 
[1] "12.3" 
[1] "12.3" 
[1] 1.23 
[1] "1.23" 
[1] "1.23" 
[1] "1.23" 
[1] 0.123 
[1] "0.123" 
[1] "0.123" 
[1] "0.123" 

Qui, rotondo signif e il formato il risultato 10.00001 formatoC con flag = "#" correttamente fa i numeri piccoli ma non i numeri grandi

C'è un modo migliore?

+0

provare anche applicare, lapply e sapply invece di looping ... –

+0

io possa avere un errore concettuale lordo, ma non la 'apply' famiglia di funzioni ancora utilizzare i cicli? Ma astrae i loop per il codice è più pulito e più facile da leggere, con meno di pulizia. Destra? –

+0

Mi spiace, il ciclo è lì solo per mostrare i risultati, avevo originariamente signif (numeri, cifre = 3) ma che per impostazione predefinita si riferiva alla notazione scientifica per qualche motivo. – PaulHurleyuk

risposta

22

Mi spiace di non averlo mai aggiornato in quel momento. Nessuna delle affermazioni nella mia domanda, o prettynum ha funzionato. Alla fine ho usato

print(formatC(signif(numbers[n],digits=3), digits=3,format="fg", flag="#")) 

che ha correttamente affrontato zero finali e numeri grandi.

+5

Felice di vedere che l'uso di 'formatC()' era la soluzione [ come ho portato quella funzione su R, e in particolare ho introdotto 'format =" fg "' anch'io con una certa considerazione.Tipicamente, al giorno d'oggi, 'sprintf()' è spesso preferito per formatC(), ma in effetti, non vedo un modo carino per ottenere la soluzione tramite sprintf() invece di formatC(). BTW: dati i vostri 'numeri', ho trovato conveniente usare' sapply' invece del ciclo for 'zaffato (numeri, funzione (N) formatC (signif (N, cifre = 3), cifre = 3, formato = "fg", flag = "#")) ' –

12

Sei al corrente di prettyNum() e di tutte le sue opzioni?

+0

Ehi, bello, Dirk. Una buona opzione di base per sapere. – isomorphismes

+0

qualche consiglio su come formattare un carattere numerico: '1000 -> 1k',' 10000 -> 10k', '1000000 -> 1M',' 1e7 -> 10M'? – jangorecki

+3

@Jan c'è un pacchetto abbastanza nuovo che lo fa: [prettyunits] (http://cran.r-project.org/web/packages/prettyunits/) –

4

Un'opzione più barebone è options(), che fa solo l'arrotondamento. Se hai intenzione di farlo molto, ti suggerisco di controllare Sweave.

> a <- 1.23456789 
> options(digits=2) 
> a 
[1] 1.2 
> options(digits=6) 
> a 
[1] 1.23457 
3

Se ti piace la notazione scientifica il metodo di

> format(2^31-1, scientific = TRUE, digits = 3) 
[1] "2.15e+09" 
1

Paul Hurley sopra funzionato bene per me sia per i numeri positivi e negativi. Di seguito è riportato un codice che modifica la soluzione di Paul in una funzione in cui è possibile specificare le cifre significative desiderate.

sigfig <- function(vec, n=3){ 
### function to round values to N significant digits 
# input: vec  vector of numeric 
#   n   integer is the required sigfig 
# output: outvec vector of numeric rounded to N sigfig 

formatC(signif(vec,digits=n), digits=n,format="fg", flag="#") 

}  # end of function sigfig 

Per verificare il funzionamento OK

numbers <- c(50000.01, 1000.001, 10.00001, 12345, 1234.5, 123.45, 1.2345, 0.12345, 0.000, -50000.01, -1000.001,-10.00001, -12345, -1234.5, -123.45, -1.2345, -0.12345, -0.000) 
sigfig(numbers) # defaults to 3 
sigfig(numbers, 3) 
sigfig(numbers, 1) 
sigfig(numbers, 6) 
1

Un'altra modifica sulla risposta di Paolo. Sembra che lasci anche un decimale finale. Sto rimuovendo con gsub:

sigfig <- function(vec, digits){ 
    return(gsub("\\.$", "", formatC(signif(vec,digits=digits), digits=digits, format="fg", flag="#"))) 
} 
Problemi correlati