Rで数値を「変換」する必要があります。例として、
「フロア」操作は次のように動作します。
138 -> 100
1233 -> 1000
「上限」操作は次のように動作します。
138 -> 200
1233 -> 2000
Rでこれを達成する簡単な方法はありますか? ありがとう
Rで数値を「変換」する必要があります。例として、
「フロア」操作は次のように動作します。
138 -> 100
1233 -> 1000
「上限」操作は次のように動作します。
138 -> 200
1233 -> 2000
Rでこれを達成する簡単な方法はありますか? ありがとう
指数を個別に抽出できます。
floorEx <- function(x) {
ex <- 10^trunc(log10(x))
return(trunc(x/ex)*ex)
}
ceilingEx <- function(x) {
ex <- 10^trunc(log10(x))
return(ceiling(x/ex)*ex)
}
例:
floorEx(123)
# [1] 100
ceilingEx(123)
# [1] 200
ceilingEx(c(123, 1234, 12345))
# [1] 200 2000 20000
編集:
trunc
代わりに使用して、古いex関数( )をfloor
統合して、計算を少し高速化しますex <- function(x)floor(log10(x))
floorR
基準:
## provided by @eddi
floorR <- function(x) {r <- signif(x, 1); r - (r > x) * 10^trunc(log10(x))}
library("microbenchmark")
x <- 123; microbenchmark(floorEx(x), floorR(x), signif(x), times=1e4)
# Unit: nanoseconds
# expr min lq median uq max neval
# floorEx(x) 2182 2414 2521 2683.0 704190 10000
# floorR(x) 2894 3150 3278 3505.5 22260 10000
# signif(x) 372 472 507 556.0 10963 10000
x <- 1:1000; microbenchmark(floorEx(x), floorR(x), signif(x), times=1e2)
# Unit: microseconds
# expr min lq median uq max neval
# floorEx(x) 100.560 101.2460 101.6945 115.6385 818.895 100
# floorR(x) 354.848 355.4705 356.0420 375.9210 1074.582 100
# signif(x) 114.608 115.2120 115.4695 119.1805 186.738 100
あなたの質問に直接答えるものではありませんが、以下も参照してくださいsignif
。
R> x <- 138
R> signif(x,1)
[1] 100
R> x <- 1712
R> signif(x,1)
[1] 2000
別のオプション:
floor2 <- function(x) {
mag <- 10^(nchar(round(x))-1)
(x %/% mag) * mag
}
ceil2 <- function(x) {
mag <- 10^(nchar(round(x))-1)
((x + mag) %/% mag) * mag
}