web-dev-qa-db-ja.com

複数の桁にわたるログシーケンスを作成する

Ggplot2チャートで対数スケールのカスタムブレーク間隔を設定するために、複数のシーケンスから次のベクトルを作成しました。

breaks <- c(seq(2000, 10000, by = 1000),
        seq(20000, 100000, by = 10000),
        seq (200000, 1000000, by = 100000),
        seq (2000000,10000000, by = 1000000),
        seq (20000000,100000000, by = 10000000))

これは迅速で汚いですが、ログ間隔で2,000から100,000,000までの望ましいブレークが得られます。

> breaks
 [1] 2e+03 3e+03 4e+03 5e+03 6e+03 7e+03 8e+03 9e+03 1e+04 2e+04 3e+04 4e+04
[13] 5e+04 6e+04 7e+04 8e+04 9e+04 1e+05 2e+05 3e+05 4e+05 5e+05 6e+05 7e+05
[25] 8e+05 9e+05 1e+06 2e+06 3e+06 4e+06 5e+06 6e+06 7e+06 8e+06 9e+06 1e+07
[37] 2e+07 3e+07 4e+07 5e+07 6e+07 7e+07 8e+07 9e+07 1e+08

このコードスニペットをクリーンアップして柔軟性を高めるにはどうすればよいですか?多くのログシーケンスソリューション、既存のライブラリ、および私自身の試行錯誤の検索は、あまり有益ではありませんでした。

理想的には、From、To、およびNumberOfMinorIntervalsをパラメーターとしてより単純な式に入力したいと思います。

18
Look Left

私はこれが好きです:

c(2:10 %o% 10^(3:7))
52
flodel

lseq()にはlibrary("emdbook")関数もあり、ログティック用にコードにコピーして貼り付けるだけです。 http://artax.karlin.mff.cuni .cz/r-help/library/emdbook/html/lseq.html

このように使用する独自の関数を作成しました。

_lseq <- function(from=1, to=100000, length.out=6) {
  # logarithmic spaced sequence
  # blatantly stolen from library("emdbook"), because need only this
  exp(seq(log(from), log(to), length.out = length.out))
}
_

lseq()を実行すると、_1 10 100 1000 10000 100000_が返されます

18

@flodelは近いですが、(@ look-leftのメモとして)最初のシーケンスはログではないため、パターン化された分布が得られます。

plot(c(2:10 %o% 10^(3:7)), log = 'y')

enter image description here

代わりに、指数をseqだけにします。

plot(10^(seq(1,10,.2)), log = 'y')

enter image description here

5
geotheory

これがあなたにとって十分に一般的であるかどうかはわかりませんが、この関数は少なくとも出発点である必要があります

logbreaks<-function(from=3, to=7, m=10) {
    unlist(lapply(3:7, function(x) seq(2*10^x, 10*10^x, length.out=m-1)), )
}

#generate your data
logbreaks(3,7,10)

10の指数としてのto/fromパラメーター。マイナーブレークの数は、ブレークベクトルの実際の長さより1つ多くなります。

1
MrFlick

これは自動的に_length.out_を計算し、byをサポートして、seq()にいくらか類似したインクリメントを決定します。

答えは、@ Christoph Safferlingのソリューションと https://stackoverflow.com/a/5237650/2480079 を組み合わせたものです。

_lseqBy <- function(from=1, to=100000, by=1, length.out=log10(to/from)+1) {
  tmp <- exp(seq(log(from), log(to), length.out = length.out))
  tmp[seq(1, length(tmp), by)]  
}
_

例:

_> lseqBy(from = 10, to = 100000, by = 1)
[1] 1e+01 1e+02 1e+03 1e+04 1e+05
> lseqBy(from = 10, to = 100000, by = 2)
[1] 1e+01 1e+03 1e+05
> lseqBy(from = 10, to = 100000, by = 3)
[1]    10 10000
_
0
user4786271