« 2022年11月 | トップページ | 2023年1月 »

2022年12月27日 (火)

[R]文字列から日付を作成する

as.Date関数もしくはstrptime関数を使う。as.Dateは一部の書式にしか対応しておらず、as.Date関数で対応していない書式の場合は、strptime関数を使う。



> s1 <- c("1991/02/03", "1991/2/3")
> s2 <- c("1991-02-03", "1991-2-3")
> s3 <- c("91/2/3")
> as.Date(c(s1, s2, s3))
[1] "1991-02-03" "1991-02-03" NA NA "0091-02-03"
> strptime(s2, "%Y-%m-%d")
[1] "1991-02-03 JST" "1991-02-03 JST"
> strptime(s3, "%y/%m/%d")
[1] "1991-02-03 JST"


%Yなどの書式文字列については、strptimeのヘルプを参照のこと。



> ?strptime

2022年12月24日 (土)

[R]余因子行列を求める

polyMatrixパッケージのadjoint関数を使う。以下、使用例。計算に用いた行列はここhttps://jp.mathworks.com/help/symbolic/adjoint.htmlを参考にしている。

> d <- c(8, 3, 4, 1, 5, 9, 6, 7, 2)
> mx <- matrix(d, 3)
> mx
[,1] [,2] [,3]
[1,] 8 1 6
[2,] 3 5 7
[3,] 4 9 2
> adjoint(mx)
[,1] [,2] [,3]
[1,] -53 52 -23
[2,] 22 -8 -38
[3,] 7 -68 37

余因子行列の性質 A A~ = A~ A ~ = |A|・En を確認する。

> print(mx %*% adjoint(mx))
[,1] [,2] [,3]
[1,] -3.600000e+02 2.842171e-13 -5.684342e-14
[2,] -7.815970e-14 -3.600000e+02 -5.684342e-14
[3,] -8.704149e-14 1.421085e-13 -3.600000e+02
> print(adjoint(mx) %*% mx)
[,1] [,2] [,3]
[1,] -3.600000e+02 2.842171e-14 -1.136868e-13
[2,] 5.684342e-14 -3.600000e+02 5.684342e-14
[3,] 8.526513e-14 1.705303e-13 -3.600000e+02
> print(det(mx) * diag(nrow(mx)))
[,1] [,2] [,3]
[1,] -360 0 0
[2,] 0 -360 0
[3,] 0 0 -360

上2つの計算結果の非対角成分は非常に小さいので0と見なしてよく、上記の性質を満たしていることが確認できた。

2022年12月23日 (金)

[R]余因子を求める

polyMatrixパッケージのcofactor関数を使う。以下、使用例。計算に用いた行列はここを参考にしており、先に余因子行列をadjoint関数を使用して求めている。

> d <- c(8, 3, 4, 1, 5, 9, 6, 7, 2)
> mx <- matrix(d, 3)
> print(mx)
[,1] [,2] [,3]
[1,] 8 1 6
[2,] 3 5 7
[3,] 4 9 2
> adjoint(mx)
[,1] [,2] [,3]
[1,] -53 52 -23
[2,] 22 -8 -38
[3,] 7 -68 37
> cofactor(mx, 1, 2)
[1] 22
> cofactor(mx, 2, 3)
[1] -68

2022年12月19日 (月)

[R]パスカルの三角形を求める

以下のスクリプトを実行する。1~12のパスカルの三角形を求めている。

for (i in 1:12) {
cat(sprintf("%2d: ", i))
for (j in 0:i) {
cat(sprintf("%3d ", choose(i, j)))
}
cat("\n")
}

出力

 1:   1   1 
2: 1 2 1
3: 1 3 3 1
4: 1 4 6 4 1
5: 1 5 10 10 5 1
6: 1 6 15 20 15 6 1
7: 1 7 21 35 35 21 7 1
8: 1 8 28 56 70 56 28 8 1
9: 1 9 36 84 126 126 84 36 9 1
10: 1 10 45 120 210 252 210 120 45 10 1
11: 1 11 55 165 330 462 462 330 165 55 11 1
12: 1 12 66 220 495 792 924 792 495 220 66 12 1

2022年12月18日 (日)

[R]ベクトルの特殊な値(NULL, NA, NaN, Inf)

NULL

ヌル。要素が空であること。この「空」とは、0や""が入っているわけではなく、それすら格納されていない、まっさらな状態ということ。NULLか否かの判定には、is.null関数を使う。

> n <- c(NULL)
> print(n)
NULL
> length(n)
[1] 0
> n <- c(1:2, NULL, 3:5)
> print(n)
[1] 1 2 3 4 5
> length(n)
[1] 5
> print(is.null(NULL))
[1] TRUE
> print(is.null(NA))
[1] FALSE
> print(is.null(NaN))
[1] FALSE

よくある使い方として、for文などで繰り返し値を追加するベクトルの初期化に使われる。

> n <- as.integer(NULL)
> print(n)
integer(0)
> for (i in 1:4) n <- append(n, 2 ^ i)
> print(n)
[1] 2 4 8 16

 

NA

Not Available。欠損値のこと。ベクトルの特殊な値の一つ。NAはどのような演算をしても、演算結果はNAになる。NAか否かの判定にはis.na関数を使う。

> n <- c(1, 2, NA, 4)
> print(n)
[1] 1 2 NA 4
> print(n + 10)
[1] 11 12 NA 14
> print(n / 2)
[1] 0.5 1.0 NA 2.0
> print(n == 1)
[1] TRUE FALSE NA FALSE
> print(is.na(n))
[1] FALSE FALSE TRUE FALSE

 

NaN

ナン。Not A Number。非数のこと。ベクトルの特殊な値の一つ。ゼロ除算などで正常な演算結果が得られなかった場合にNaNになる。NaNか否かの判定にはis.nan関数を使う。

> print(0 / 0)
[1] NaN
> print(Inf / Inf)
[1] NaN
> is.nan(NA)
[1] FALSE
> is.nan(Inf / Inf)
[1] TRUE

 

Inf

数値計算における無限大(∞)のこと。ベクトルの特殊な値の一つ。演算結果が無限大になる演算結果がInfになる。数学同様、負数の無限大もある。Infか否かの判定には、is.infinite関数を使う。

> print(1 / 0)
[1] Inf
> print(-1 / 0)
[1] -Inf
> 1 / 1.e-308
[1] 1e+308
> 1 / 1.e-309
[1] Inf
> n <- c(1, 2, Inf, 4)
> print(n)
[1] 1 2 Inf 4
> print(is.infinite(n))
[1] FALSE FALSE TRUE FALSE

2022年12月14日 (水)

[R]文字コードを指定してCSVファイルを読み込む

read.csv関数を使う。その際、fileEncodingオプションに文字コードを指定する。シフトJIS(CP932)であれば「CP932」を、UTF-8であれば「UTF-8」を指定する。特に指定をしないと、今の環境のロケールの文字コードで読み込む。指定に誤りがあると、エラーが発生する。

以下は、以下のテキストをそれぞれシフトJIS(CP932)でtextcp932.csv、UTF-8でtextutf8.csvと保存をして、それぞれ読み込ませた例。

no,姓,名
1,中野,一花
2,中野,二乃

実行結果。

> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"
> dtf <- read.csv("textcp932.csv")
> print(dtf)
no 姓 名
1 1 中野 一花
2 2 中野 二乃
> dtf <- read.csv("textcp932.csv", fileEncoding = "CP932")
> print(dtf)
no 姓 名
1 1 中野 一花
2 2 中野 二乃
> dtf <- read.csv("textutf8.csv")
make.names(col.names, unique = TRUE) でエラー:
2 は不正なマルチバイト文字です
> dtf <- read.csv("textcp932.csv", fileEncoding = "CP932")
> print(dtf)
no 姓 名
1 1 中野 一花
2 2 中野 二乃

2022年12月 8日 (木)

[R]ロケールの確認と設定

ロケールの確認はSys.getlocale関数を使う。

ウィンドウズ版は4.1.3までは、デフォルトのロケールは「Japanese_Japan.932」。

> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"

4.2.0以降は「Japanese_Japan.utf8」になった。

> Sys.getlocale()
[1] "LC_COLLATE=Japanese_Japan.utf8;LC_CTYPE=Japanese_Japan.utf8;LC_MONETARY=Japanese_Japan.utf8;LC_NUMERIC=C;LC_TIME=Japanese_Japan.utf8"

そのため、例えばこれまでファイルを読み込む際にエンコードを指定しなかった場合、スクリプトが動作しない可能性がある。

2022年12月 7日 (水)

[R]パッケージを簡単にインストールする

install.packages関数を使うとパッケージをインストールすることができるが、デフォルトでは、CRANのミラーを選択するダイアログが表示される。

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

ダイアログが表示されずにそのままインストールする方法がある。options関数のreposオプションに、あらかじめCRANのミラーサイトを登録しておけばよい。

> options(repos = "https://cran.ism.ac.jp/")
> install.packages("colorspace")
パッケージを ‘C:/Users/○○/Documents/R/win-library/4.1’ 中にインストールします
(‘lib’ が指定されていないため)
URL 'https://cran.ism.ac.jp/bin/windows/contrib/4.1/colorspace_2.0-3.zip' を試しています
Content type 'application/zip' length 2651058 bytes (2.5 MB)
downloaded 2.5 MB
package ‘colorspace’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\○○

reposオプションに、有効なミラーサイトを登録しないと、エラーが発生する。

> options(repos = "https://www.ism.ac.jp/")
> install.packages("colorspace")
パッケージを ‘C:/Users/○○/Documents/R/win-library/4.1’ 中にインストールします
(‘lib’ が指定されていないため)
警告: unable to access index for repository https://www.ism.ac.jp/src/contrib:
URL 'https://www.ism.ac.jp/src/contrib/PACKAGES' を開けません

このreposオプションによる設定を無効にするには、Rを再起動する。

2022年12月 6日 (火)

[R]確率変数 X が正規分布 N(μ, σ^2) に従うときの確率 P を求める

確率変数 X が正規分布 N(13, 4^2) に従うときの、次の確率 P それぞれ求める。

(1) P (7≦X≦19), (2) P (1≦X≦25), (3) P (X≦20)

なお、答えはそれぞれ 0.8663…, 0.9973…, 0.9599… である。

> # (1)
> pnorm(19, 13, 4) - pnorm(7, 13, 4)
[1] 0.8663856
> # (2)
> pnorm(25, 13, 4) - pnorm(1, 13, 4)
[1] 0.9973002
> # (3)
> pnorm(20, 13, 4)
[1] 0.9599408

2022年12月 5日 (月)

[R]女子大生200人の体重とバストの歪度と尖度(「統計解析のはなし」(東京図書)、p.43)

> dtf <- read.csv("table1_1_1.csv", header = TRUE)
> rdtf <- data.frame(c(0., 0.), c(0., 0.))
> colnames(rdtf) <- c("体重", "バスト")
> rownames(rdtf) <- c("歪度 a3", "尖度 a4")
> for (i in 3:4) {
+ xi <- dtf[, i]
+ nn <- length(xi)
+ xm <- mean(xi)
+ ss <- sqrt((nn - 1) / nn * var(xi))
+ a3 <- sum((xi - xm) ^ 3) / (nn * ss ^ 3)
+ a4 <- sum((xi - xm) ^ 4) / (nn * ss ^ 4) - 3
+ rdtf[1, i - 2] <- a3
+ rdtf[2, i - 2] <- a4
+ }
> print(rdtf)
体重 バスト
歪度 a3 0.6519655 1.190016
尖度 a4 0.8305713 3.170911

2022年12月 4日 (日)

[R]ガンマ関数の値を求める

gamma関数を使う。有名なガンマ関数の性質であるΓ(n) = (n - 1)!(n≧2,整数)について、

> gamma(1)
[1] 1
> gamma(2:5)
[1] 1 2 6 24

となる。以下も有名な値(Γ(1/2)=√π)。

> gamma(1 / 2)
[1] 1.772454
> sqrt(pi)
[1] 1.772454

2022年12月 3日 (土)

[R]新常用漢字表の漢字を含むテキストファイルを読み込む

Windows版Rのバージョン4.1.3までは、新常用漢字表の漢字のうちUnicodeにしか存在しない文字、すなわちシフトJISコードが割り当てられていない漢字を含むテキストファイルを読み込むことはエンコードを指定してもできなかった。例えば、以下の内容をテキストファイルmoji.txtとしてUTF-8で保存する。

ABC123
鈴木みのり
セナディア
補塡する
頰をなでる
辰𠮷𠀋一郎
𩸽(ホッケ)を食べる
𩹉(トビウオ)を捕まえる

バージョン4.1.3で文字コードにUTF-8を指定してscan関数で読み込むと失敗する。

> R.Version()$version.string
[1] "R version 4.1.3 (2022-03-10)"
> s <- scan(file = "moji.txt", what = character(), sep = "\n", fileEncoding = "UTF-8")
Read 4 items
警告メッセージ:
scan(file = "moji.txt", what = character(), sep = "\n", で:
入力コネクション 'moji.txt' に不正な入力がありました
> print(s)
[1] "ABC123" "鈴木みのり" "セナディア" "補"

バージョン4.2.2で文字コードにUTF-8を指定してscan関数で読み込むとうまくいく。

> R.Version()$version.string
[1] "R version 4.2.0 (2022-04-22 ucrt)"
> s <- scan(file = "moji.txt", what = character(), sep = "\n", fileEncoding = "UTF-8")
Read 8 items
> print(s)
[1] "ABC123" "鈴木みのり" "セナディア"
[4] "補塡する" "頰をなでる" "辰𠮷𠀋一郎"
[7] "𩸽(ホッケ)を食べる" "𩹉(トビウオ)を捕まえる"

サロゲートペアの文字(6~8要素目)も、正しく読み込んでいることがわかる。

2022年12月 2日 (金)

[R]現在の環境の文字コードの種類を得る

localeToCharset関数を使う。引数に何も与えないと、現在の環境の、文字コードの種類を返す。

例えば、Windows版のバージョン4.1.3であれば、以下のようになるはず。

> localeToCharset()
[1] "CP932"

Windows版のバージョン4.2.2であれば、以下のようになるはず。

> localeToCharset()
[1] "UTF-8"

ロケールが返されるのではなく、文字コードの種類が返されることに注意。

2022年12月 1日 (木)

[R]バージョン4.2以降の環境でシフトJISのファイルを扱う

Windows版Rのバージョン4.2以降はデフォルトの文字コードがUTF-8になり、初期状態でシフトJISのファイルは扱えなくなった。例えば、以下のようなスクリプトをjhello.Rと保存する。

cat("こんにちは、世界。\n")

実行してみる。

> source("jhello.R")
source("jhello.R") でエラー:
構文解析中に不正なマルチバイト文字列がありました (1 行)

なお、文字コードを指定すれば問題なく実行できる。

> source("jhello.R", encoding = "932")
こんにちは、世界。

その都度encodingオプションを指定するのは煩わしく、デフォルトの状態でシフトJISを使えるようにするには、Sys.setlocale関数でその環境のロケールを変更すればよい。以下のとおりに実行する。

> Sys.setlocale(locale = "Japanese_Japan.932")
[1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"
警告メッセージ:
Sys.setlocale(locale = "Japanese_Japan.932") で:
using locale code page other than 65001 ("UTF-8") may cause problems

最初の1回目には、UTF-8以外を使うことは問題発生の原因となるだろうと警告されるが、これで文字コードはUTF-8になった。

> Sys.setlocale(locale = "Japanese_Japan.932")
[1] "LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932"
警告メッセージ:
Sys.setlocale(locale = "Japanese_Japan.932") で:
using locale code page other than 65001 ("UTF-8") may cause problems
> source("jhello.R")
こんにちは、世界。

このロケールの設定はRを再起動すると元に戻ってしまう(デフォルトの文字のエンコードがUTF-8になる)。これを起動時に自動的にシフトJISにするには、R起動時のカレントディレクトリ(ダブルクリックした.RDataファイルが置かれたフォルダー)に置かれたテキストファイル.RProfileに(無ければ新規作成)、以下の1行を加える。

Sys.setlocale(locale = "Japanese_Japan.932")

上記同様に、R起動時に警告メッセージが表示されるが、ただのメッセージであり、害はない。

« 2022年11月 | トップページ | 2023年1月 »

無料ブログはココログ

■■

■■■