9

Rで数値を「変換」する必要があります。例として、

「フロア」操作は次のように動作します。

138  -> 100
1233 -> 1000

「上限」操作は次のように動作します。

138  -> 200
1233 -> 2000

Rでこれを達成する簡単な方法はありますか? ありがとう

4

5 に答える 5

13

指数を個別に抽出できます。

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))
  • @eddi と比較するベンチマークを追加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
于 2013-05-09T14:23:48.607 に答える
8

あなたの質問に直接答えるものではありませんが、以下も参照してくださいsignif

R> x <- 138
R> signif(x,1)
[1] 100
R> x <- 1712
R> signif(x,1)
[1] 2000
于 2013-05-09T14:25:52.547 に答える
5

別のオプション:

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
}
于 2013-05-09T14:48:46.763 に答える