的R函數格式編號是否有利用標準單元的前綴A R函數(或任何封裝)允許格式編號(整數)(千,兆等...),所以是否有使用單元前綴
10 -> 10
100 -> 1K
0.01 - > 10m
etc ... 我可以自己做,但我寧願不要重新發明輪子。
的R函數格式編號是否有利用標準單元的前綴A R函數(或任何封裝)允許格式編號(整數)(千,兆等...),所以是否有使用單元前綴
10 -> 10
100 -> 1K
0.01 - > 10m
etc ... 我可以自己做,但我寧願不要重新發明輪子。
require(sitools)
f2si(80000)
[1] "80 k"
f2si(8E12)
[1] "8 T"
這似乎是很簡單的,因爲它附加兩個空格,如果不使用SI前綴:
f2si(80)
[1] "80 "
功能是便於修改,包括四捨五入。我還用附加空格解決了這個問題。
f2si2<-function (number,rounding=F)
{
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)
pre <- c("y", "z", "a", "f", "p", "n", "u", "m", "", "k",
"M", "G", "T", "P", "E", "Z", "Y")
ix <- findInterval(number, lut)
if (lut[ix]!=1) {
if (rounding==T) {
sistring <- paste(round(number/lut[ix]), pre[ix])
}
else {
sistring <- paste(number/lut[ix], pre[ix])
}
}
else {
sistring <- as.character(number)
}
return(sistring)
}
f2si2(12345)
[1] "12.345 k"
f2si2(12345,T)
[1] "12 k"
我來到這裏的同一個問題。感謝羅蘭的回答;我建立在他的代碼有一些變化:
希望這是很有幫助的。
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)
從這段代碼中,爲常用的財務單位(K,MM,Bn,Tr)編寫類似的函數也很容易。
稍作修改的版本考慮到負數:
f2si<-function (number, rounding=F, digits=ifelse(rounding, NA, 6))
{
mysign <- ""
if (number<0) {
mysign <- "-"
}
number <- abs(number)
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(mysign,mysign,round(number/lut[ix]), pre[ix])
}
else if (rounding == T || is.numeric(digits)) {
sistring <- paste(mysign,signif(number/lut[ix], digits), pre[ix],sep="")
}
else {
sistring <- paste(mysign,number/lut[ix], pre[ix],sep="")
}
} else {
sistring <- paste(mysign,as.character(number),sep="")
}
return(sistring)
}
我一直在尋找千(K),百萬(M)和億(B)數轉換器。我修改了這個例程以獲取一個數字向量/單個數字,並將所需的輸出分發出去。
CurrencyFormat <-function (number,rounding=F)
{
first <- TRUE
lut <- c(1, 1000, 1000000, 1000000000,1000000000000)
pre <- c("", "K", "M", "B", "T")
if (length(number) > 1) {
for (cnt in 1:length(number)){
ix <- findInterval(number[cnt], lut)
if (ix != 0 | ix != 1){
if (rounding==T) {
sistring <- paste(round(number[cnt]/lut[ix]), pre[ix])
}
else {
sistring <- paste(signif(number[cnt]/lut[ix],digits=5), pre[ix])
}
if (first){
tnumber <- sistring
fnumber <- tnumber
first <- FALSE
}
else
fnumber <- append(fnumber, sistring)
}
else {
sistring <- number[cnt]
if (first){
tnumber <- sistring
fnumber <- tnumber
first <- FALSE
}
else
fnumber <- append(fnumber, sistring)
}
}
return(fnumber)
}
else{
ix <- findInterval(number, lut)
if (ix != 0 | ix != 1){
if (rounding==T) {
sistring <- paste(round(number/lut[ix]), pre[ix])
}
else {
sistring <- paste(signif(number/lut[ix],digits=5), pre[ix])
}
return(sistring)
}
else
return(number)
}
}
例子:
CurrencyFormat(1.25,F)
[1] "1.25 "
CurrencyFormat(1000.25,F)
[1] "1.0002 K"
CurrencyFormat(c(1,45,1234, 4.36e+06, 2.84e+04, 2.01e+06),F)
[1] "1 " "45 " "1.234 K" "4.36 M" "28.4 K" "2.01 M"
'utils的::: print.object_size'實現它的一些二進制單位 – James
我只是要小心這樣做W/O校對。例如,雖然ISO允許3.5毫米的尺寸,但在標準使用情況下,每個人的尺寸均爲3.5公里。由於從不使用無量綱值的前綴,你打算如何自己附加物理單元? –
我明白你的觀點。然而,我所做的並不是「嚴肅」,我沒有任何單位。我只是在劇情/表格中顯示價值,我需要每個人都適合3/4個字符。 10k比1000或1e + 03更緊湊。 – mb14