Sono venuto qui con la stessa domanda. Grazie a Roland per la sua risposta; Ho costruito il suo codice con alcune modifiche:
- Consente cifre significative da specificare quando si aggira = FALSE (default a 6, proprio come la funzione built-in 'signif')
- non Vuol genera un errore con i valori sotto 1e-24
- Uscite notazione scientifica (nessuna unità) per i valori di cui sopra 1e27
Spero che questo è utile.
f2si<-function (number, rounding=F, digits=ifelse(rounding, NA, 6))
{
lut <- c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12, 1e-09, 1e-06,
0.001, 1, 1000, 1e+06, 1e+09, 1e+12, 1e+15, 1e+18, 1e+21,
1e+24, 1e+27)
pre <- c("y", "z", "a", "f", "p", "n", "u", "m", "", "k",
"M", "G", "T", "P", "E", "Z", "Y", NA)
ix <- findInterval(number, lut)
if (ix>0 && ix<length(lut) && lut[ix]!=1) {
if (rounding==T && !is.numeric(digits)) {
sistring <- paste(round(number/lut[ix]), pre[ix])
}
else if (rounding == T || is.numeric(digits)) {
sistring <- paste(signif(number/lut[ix], digits), pre[ix])
}
else {
sistring <- paste(number/lut[ix], pre[ix])
}
}
else {
sistring <- as.character(number)
}
return(sistring)
}
f2si(12345)
[1] "12.345 k"
f2si(12345, T)
[1] "12 k"
f2si(10^31)
[1] "1e+31" # (previous version would output "1e+07 Y"
f2si(10^-25)
[1] "1e-25" # (previous version would throw error)
f2si(123456789)
[1] "123.457 M" # (previous version would output ""123.456789 M"
f2si(123456789, digits=4)
[1] "123.5 M" # (note .456 is rounded up to .5)
Da questo codice è abbastanza facile scrivere una funzione simile per le unità finanziarie comunemente usati (K, MM, Bn, Tr), anche.
'utils ::: print.object_size' implementa per alcune unità binarie – James
vorrei solo essere attenti a fare questo w/o correzione di bozze. Ad esempio, mentre cose come 3.5 mm sono consentite dalla ISO, nell'uso standard tutti vanno con 3.5e3 km. Dal momento che non si usano mai prefissi per valori adimensionali, come pensate di aggiungere le unità fisiche da sole? –
Vedo il tuo punto. Comunque quello che sto facendo non è "serio" e non ho nessuna unità. Sto solo visualizzando il valore in una trama/tabella e ho bisogno di ognuno per adattarlo a 3/4 caratteri. 10k è più compatto di 1000 o 1e + 03. – mb14