« 2021年5月 | トップページ | 2021年7月 »

2021年6月29日 (火)

[R]テキストファイルを高速で読み込む

data.tableパッケージを利用する。以下は、100万行のテキストファイルtemp.txtを作成し、Rに標準で搭載されているread.table関数と、data.tableパッケージに含まれているfread関数で、それぞれそのファイルを読み込む時間を計測した結果。

> library(data.table)
> mx <- matrix(rnorm(1000000 * 4), ncol = 4)
> write.table(mx, "temp.txt", col.names = FALSE, row.names = FALSE)
> system.time(dtf <- read.table("temp.txt", header = FALSE))
ユーザ システム 経過
7.94 0.15 8.14
> system.time(dtb <- fread("temp.txt"))
ユーザ システム 経過
0.13 0.01 0.07
> system.time(dtf <- read.table("temp.txt", header = FALSE))
ユーザ システム 経過
7.41 0.09 7.51
> system.time(dtb <- fread("temp.txt"))
ユーザ システム 経過
0.17 0.02 0.04
> dim(dtf)
[1] 1000000 4
> dim(dtb)
[1] 1000000 4
> head(dtf)
V1 V2 V3 V4
1 1.7752384 -1.4123053 0.24326013 0.5067002
2 -1.3369478 0.4076904 0.42491207 -1.6561556
3 -1.4287960 0.2838613 2.01597774 -1.0682637
4 0.7791319 0.5361162 0.05211674 0.2194605
5 -0.8555709 -0.5486108 0.11662963 2.0608156
6 0.8034380 -2.0021208 -0.29818598 -0.4815675
> dim(dtb)
[1] 1000000 4
> head(dtb)
V1 V2 V3 V4
1: 1.7752384 -1.4123053 0.24326013 0.5067002
2: -1.3369478 0.4076904 0.42491207 -1.6561556
3: -1.4287960 0.2838613 2.01597774 -1.0682637
4: 0.7791319 0.5361162 0.05211674 0.2194605
5: -0.8555709 -0.5486108 0.11662963 2.0608156
6: 0.8034380 -2.0021208 -0.29818598 -0.4815675

キャッシュの効果を考慮して、交互に2回ずつ実施している。最後に、読み込んだデータフレームとデータテーブルの次元とそれぞれの長さを表示している。ファイルの読み込みは、fread関数のほうが明らかに早いことがわかる。

2021年6月28日 (月)

[R]テキストファイルを高速で読み込む

形式はともかく、とにかくテキストファイルを高速で読み込みたい場合は、readrパッケージのread_lines関数を使う。以下は、最初にファイルのサイズが80,000,000バイトのテキストファイルを作成し、それをRに標準で搭載されているscan関数とreadrパッケージのread_lines関数で3回ずつ読み込み、それに要した時間を計測した例。

作成したファイル(temp.txt)はWindowsのUTF-8環境で作成しており、1行78文字で改行コードはCR+LF、それが100万行あるテキストファイルのため、ファイルサイズは(78+2)*1,000,000=80,000,000バイトである。

> lns <- sprintf("%078.0f", floor(runif(10 ^ 6, 0, 10 ^ 78)))
> head(lns, 3)
[1] "214418413117527971264060246646220804826684668888086204426268668846486202246440"
[2] "923248178558424118646448222222446482266040066668404462646882848600280046042684"
[3] "022663331590592860430486024422482606408624828266462802622284262068424466884282"
> cat(lns, file = "temp.txt", sep = "\n")
> system.time(lns1 <- scan(file = "temp.txt", what = character(), sep = "\n", quiet = TRUE))
ユーザ システム 経過
4.74 0.11 4.95
> system.time(lns1 <- scan(file = "temp.txt", what = character(), sep = "\n", quiet = TRUE))
ユーザ システム 経過
4.64 0.16 4.81
> system.time(lns1 <- scan(file = "temp.txt", what = character(), sep = "\n", quiet = TRUE))
ユーザ システム 経過
4.56 0.14 4.70
> class(lns1)
[1] "character"
> length(lns1)
[1] 1000000
> head(lns1, 3)
[1] "214418413117527971264060246646220804826684668888086204426268668846486202246440"
[2] "923248178558424118646448222222446482266040066668404462646882848600280046042684"
[3] "022663331590592860430486024422482606408624828266462802622284262068424466884282"
> library(readr)
> system.time(lns2 <- read_lines(file = "temp.txt", progress = FALSE))
ユーザ システム 経過
1.07 0.24 0.71
> system.time(lns2 <- read_lines(file = "temp.txt", progress = FALSE))
ユーザ システム 経過
0.88 0.17 0.53
> system.time(lns2 <- read_lines(file = "temp.txt", progress = FALSE))
ユーザ システム 経過
1.04 0.06 0.53
> class(lns2)
[1] "character"
> length(lns2)
[1] 1000000
> head(lns2, 3)
[1] "214418413117527971264060246646220804826684668888086204426268668846486202246440"
[2] "923248178558424118646448222222446482266040066668404462646882848600280046042684"
[3] "022663331590592860430486024422482606408624828266462802622284262068424466884282"

単純な比較だがread_lines関数のほうが10倍弱速いことがわかる。read_lines関数で読み込んだものは、一行一要素の文字列型ベクトルになる。

2021年6月23日 (水)

[R]パッケージのインストールとアンインストール

インストールはinstall.packages関数、アンインストールはremove.packages関数を使う。以下は、tibbleパッケージをインストール、アンインストールをした例。

> install.packages("tibble")
パッケージを ‘C:/Users/○○/Documents/R/win-library/3.6’ 中にインストールします
(‘lib’ が指定されていないため)
--- このセッションで使うために、CRAN のミラーサイトを選んでください ---
(略)
> remove.packages("tibble")
パッケージを ‘C:/Users/○○/Documents/R/win-library/3.6’ から取り除きます
(‘lib’ が指定されていないため)
(略)

remove.packages関数は、パッケージのファイルを強制的に削除する。

2021年6月18日 (金)

[Excel]同点同着を考慮した順位付け

rank.eq関数を使う。例えば、以下の様にA2~A8セルに点数が入力されており、その順番をつける場合。

Rankeq

B2~B8セルに、以下を入力(貼り付け)すればよい。そうすると、上図のように順位が表示される。

=RANK.EQ(A2,A$2:A$8)

 

2021年6月17日 (木)

[R]関数の最大値・最小値を得る

optim関数を使う。最小値を得るための実行例は以下のとおり。関数 f(x) = x ^ 2 - 5 の最小値を求めている。図からf(x)が最小となるのはx = 0でその時のf(x)は5である。簡単な計算であれば、methodオプションはBFGSを指定する。計算には適当な初期値(この例では、f(x)が最小となるxの探索のための最初の値)を与える必要があり、以下の例では10としている。

Optimmin
> f <- function(xf) xf ^ 2 - 5
> x <- seq(-5, 5, by = 0.2)
> y <- f(x)
> optim(10, f, method = "BFGS")
$par
[1] 2.441602e-11
$value
[1] -5
$counts
function gradient
6 3
$convergence
[1] 0
$message
NULL

戻り値のparに最小となる関数の引数が、valueにはその最小となるf(x)値が格納されている。

逆に、関数の最大値を得るためには、controlオプションにリストとしてfnscaleに負の値を与える。以下の例では、関数f(x) = -(x ^ 2) - 5の最大値を求めており、図より、x=0の時に最大値f(x)=-5を得ることが明らかである。

Optimmax
> f <- function(xf) -(xf ^ 2) - 5
> x <- seq(-5, 5, by = 0.2)
> y <- f(x)
> optim(10, f, control = list(fnscale = -1), method = "BFGS")
$par
[1] 2.441602e-11
$value
[1] -5
$counts
function gradient
6 3
$convergence
[1] 0
$message
NULL

戻り値parに関数が最大となる場合の引数の値(=0)、その最大となった関数の値(=-5)が格納されている。

2021年6月13日 (日)

[Visual Basic]コマンドプロンプトでコンパイルする(Visual Studio 2019 Professional)

Visual Studio 2019 Professionalを使ってコマンドプロンプトでコンパイルする場合、「スタートメニュー」→「Visual Studio 2019」→「Developer Command Prompt for VS 2019」で起動する専用のコマンドプロンプトを使うことが一般的だが、環境変数Pathに以下を追加するだけでも使えるようになる。

C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\Roslyn

追加方法は以下のとおり。

エクスプローラー→「PC」のプロパティ→左側のメニュー「システムの詳細設定」→「システムのプロパティ」ダイアログが開いて「環境変数」ボタン→ユーザー環境変数でもシステム環境変数でもどちらでもかまわないが「Path」をクリック→「編集」ボタンを押す→「環境変数名の編集」ダイアログが開くが右側の「新規」ボタン→上記のディレクトリを追加→すべて「OK」ボタンを押して元に戻る

コンパイラーの実行ファイルはvbc.exe。

2021年6月12日 (土)

[C#]C#のコードを対話的に入力・実行する(REPL)

C#インタラクティブ(Interactive)を使う。メニュー「表示」→「その他のウィンドウ」→「C#インタラクティブ」で、専用のウィンドウが開く。「>」がコマンドプロンプト。以下、操作例。



Microsoft (R) Visual C# インタラクティブ コンパイラ バージョン 3.9.0-6.21160.10 ()
'CSharpInteractive.rsp' からコンテキストを読み込んでいます。
詳細については、「#help」と入力します。
> s = "ABC";
(1,1): error CS0103: 現在のコンテキストに 's' という名前は存在しません
> string s;
> s = "ABC";
> Console.WriteLine(s);
ABC
> s = "AB\\C";
> Console.WriteLine(s);
AB\C
> s = @"AB\\C";
> Console.WriteLine(s);
AB\\C

2021年6月10日 (木)

[R]正規分布における-σからσ(-2σから2σ)の確率(面積)を求める

pnorm関数を使う。正規分布における累積分布関数(-∞から指定の確率変数までの定積分)はpnorm関数で得られ、それを使うことで確率(面積)を求めることができる。

正規分布はσは68%、2σは95%とよく言われるが、それを求めてみる。

平均0、標準偏差が1の正規分布について、-∞から-1まで、-∞から1までそれぞれ定積分(確率(面積))を求める。

> pnorm(-1)
[1] 0.1586553
> pnorm(1)
[1] 0.8413447

いわゆるσ=1というのは、確率変数が-1から1までの範囲の定積分(面積)であるから、後者から前者を引けばよい。

> pnorm(1) - pnorm(-1)
[1] 0.6826895

2σが95%も同様に求まる。

> pnorm(2) - pnorm(-2)
[1] 0.9544997

2021年6月 2日 (水)

[Excel]正規分布における-σからσ(-2σから2σ)の確率(面積)を求める

NORM.S.DIST関数を使う。正規分布における累積分布関数(-∞から指定の確率変数までの積分)はNORM.S.DIST関数で得られ、それを使うことで確率(面積)を求めることができる。第一引数には確率変数を指定し、第二引数にはTRUEを指定する。

正規分布はσは68%、2σは95%とよく言われるが、それを求めてみる。

平均0、標準偏差が1の正規分布について、-∞から-1まで、-∞から1までの確率密度関数を定積分(確率(面積)を求める)した結果が1行目と2行目。いわゆるσ=1というのは、確率変数が-1から1までの確率密度関数の定積分(面積)であるから、2行目から1行目を引くと-σ~σの確率(面積)が求まり、それを計算したのが3行目。-2σ~2σは4行目。

2021年6月 1日 (火)

[R]正規分布における下側パーセント点、上側パーセント点、両側パーセント点を求める

qnorm関数を使う。以下は、平均10、分散3^2(標準偏差3)の正規分布における、下側5パーセント点、上側5パーセント点、両側5パーセント点を求めた例。なお、値は、下側5.065、上側14.93、両側15.88である。

> qnorm(0.05, mean = 10, sd = 3)
[1] 5.065439
> qnorm(0.05, mean = 10, sd = 3, lower.tail = FALSE)
[1] 14.93456
> qnorm(1 - 0.05, mean = 10, sd = 3)
[1] 14.93456
> qnorm(0.05 / 2, mean = 10, sd = 3, lower.tail = FALSE)
[1] 15.87989
> qnorm(1 - 0.05 / 2, mean = 10, sd = 3)
[1] 15.87989

5%であれば、0.05と指定する。

何も指定しなければ、下側パーセント点の値を返す。

上側パーセント点はlower.tailオプションをFALSEとするか「1 - 0.05」とする。

両側パーセント点は「1 - 0.05 / 2」と最後に2で割るのがポイント。

« 2021年5月 | トップページ | 2021年7月 »

無料ブログはココログ

■■

■■■