« 2026年1月 | トップページ | 2026年3月 »

2026年2月27日 (金)

[R]LU分解を行う

matrixcalcパッケージのlu.decomposition関数を使う。n次の正方行列Aが与えられたとき、下三角行列Lと上三角行列Uを用いてA = L Uと分解することを、行列AのLU分解という。戻り値はLが下三角行列、Uが上三角行列。lu.decomposition関数はピボット選択は行わないため、戻り値に置換行列はない。以下は4次の正方行列のパスカル行列をLU分解した例。最後に、元の行列に戻るかどうか計算している。

> n <- 4
> aa <- matrix(1, n, n)
> for (i in 2:n) for (j in 2:n) aa[i, j] <- aa[i, j - 1] + aa[i - 1, j]
> print(aa)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 1 2 3 4
[3,] 1 3 6 10
[4,] 1 4 10 20
> library(matrixcalc)
> r <- lu.decomposition(aa)
> print(r$L)
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 1 1 0 0
[3,] 1 2 1 0
[4,] 1 3 3 1
> print(r$U)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 0 1 2 3
[3,] 0 0 1 3
[4,] 0 0 0 1
> print(r$L %*% r$U)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 1 2 3 4
[3,] 1 3 6 10
[4,] 1 4 10 20

2026年2月26日 (木)

[R]正規表現でIPv4によるIPアドレス表記の文字列かどうか判定する

正規表現パターンに「^([0-9]+\\.){3}[0-9]+$」を指定すればよい。あらかじめ文字列の先頭と末尾の空白は取り除いておくこと。

> s <- c("12.34.56.78", "123.456.789.123", "123.456", "a.b.c.d", "ab.cd.ef.gh")
> grep("^([0-9]+\\.){3}[0-9]+$", s, value = TRUE)
[1] "12.34.56.78" "123.456.789.123"

2026年2月25日 (水)

[R]下三角行列を作成する

upper.tri関数に行列を指定すると、対角成分より上の成分(各成分を(i,j)と表記すればi<jの成分)だけTRUEを返す。これを利用してその成分に0を代入すれば、既存の行列を簡単に下三角行列(対角成分より上の成分はすべて0の行列)に変換することができる。

> set.seed(5)
> mx <- matrix(trunc(runif(16, 1, 10)), 4, 4)
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 2 1 9 3
[2,] 7 7 1 6
[3,] 9 5 3 3
[4,] 3 8 5 2
> print(upper.tri(mx))
[,1] [,2] [,3] [,4]
[1,] FALSE TRUE TRUE TRUE
[2,] FALSE FALSE TRUE TRUE
[3,] FALSE FALSE FALSE TRUE
[4,] FALSE FALSE FALSE FALSE
> mx[upper.tri(mx)] <- 0
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 2 0 0 0
[2,] 7 7 0 0
[3,] 9 5 3 0
[4,] 3 8 5 2

2026年2月24日 (火)

[R]上三角行列を作成する

lower.tri関数に行列を指定すると、対角成分より下の成分(各成分を(i,j)と表記すればi>jの成分)だけTRUEを返す。これを利用してその成分に0を代入すれば、既存の行列を簡単に上三角行列(対角成分より下の成分はすべて0の行列)に変換することができる。

> set.seed(4)
> mx <- matrix(trunc(runif(16, 1, 10)), 4, 4)
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 6 8 9 1
[2,] 1 3 1 9
[3,] 3 7 7 4
[4,] 3 9 3 5
> print(lower.tri(mx))
[,1] [,2] [,3] [,4]
[1,] FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE
> mx[lower.tri(mx)] <- 0
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 6 8 9 1
[2,] 0 3 1 9
[3,] 0 0 7 4
[4,] 0 0 0 5

2026年2月23日 (月)

[R]ディレクトリを作成する

dir.create関数を使う。以下は、一時ディレクトリ(テンポラリーディレクトリ)に、実際にディレクトリを作成した例。

> print(tempdir())
[1] "C:\\Users\\○○○\\AppData\\Local\\Temp\\×××"
> list.files(tempdir(), include.dir = TRUE)
character(0)
> dir.create(file.path(tempdir(), "鈴木みのり"))
> list.files(tempdir(), include.dir = TRUE)
[1] "鈴木みのり"
> dir.create(file.path(tempdir(), "鈴木みのり", "セナディア"))
> list.files(tempdir(), include.dir = TRUE)
[1] "鈴木みのり"
> list.files(file.path(tempdir(), "鈴木みのり"), include.dir = TRUE)
[1] "セナディア"

2026年2月18日 (水)

[R]ウェブサイトの応答ヘッダーの取得に失敗する

curlGetHeaders関数は、ウェブサイトの応答ヘッダーを得ることができるが、外部の一般のウェブサイト(グーグルやヤフー)は読み取れるのにlocalhostやイントラのウェブサイトが読み取れないことがある。この場合、内部のウェブサイトはプロキシを経由しないで直接接続する設定になっていると考えられる。そのため、特定のURLではプロキシを使わないような設定にすればよい。

プロキシを使わずに接続するドメインを、Sys.setenv関数を使って環境変数no_proxyに設定すればよい。複数ある場合はコンマで区切って指定する。

> curlGetHeaders("https://www.google.co.jp") |> head(1)
[1] "HTTP/1.1 200 Connection established\r\n"
> curlGetHeaders("http://localhost") |> head(1)
[1] "HTTP/1.0 403 Forbidden\r\n"
> curlGetHeaders("http://intra.company.co.jp") |> head(1)
[1] "HTTP/1.0 502 Bad Gateway\r\n"
> Sys.setenv("no_proxy" = "localhost,intra.company.co.jp,123.456.78.9")
> curlGetHeaders("http://localhost") |> head(1)
[1] "HTTP/1.1 200 OK\r\n"
> curlGetHeaders("http://intra.company.co.jp") |> head(1)
[1] "HTTP/1.1 200 OK\r\n"
> curlGetHeaders("http://123.456.78.9") |> head(1)
[1] "HTTP/1.1 200 OK\r\n"

URLにIPアドレスを直接指定する場合もあるだろうが、そのような場合read_htmlはまったく応答せずしばらくR自体が停止したような状態になってしまうが、上記の例のとおりにそのまま書き込めば、応答するようになる。

2026年2月17日 (火)

[R]エラーメッセージ「open.connection(x, "rb") でエラー: コネクションを開くことができません」

rvestパッケージのread_html関数でウェブサイトの情報を読み取ると、読み取りに失敗してこのメッセージが表示される場合がある。外部の一般のウェブサイト(グーグルやヤフー)は読み取れるのにlocalhostやイントラのウェブサイトが読み取れないことがある。この場合、内部のウェブサイトはプロキシを経由しないで直接接続する設定になっていると考えられる。そのため、特定のURLではプロキシを使わないような設定にすればよい。

> library(rvest)
> html <- read_html("https://www.google.co.jp")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"
> html <- read_html("http://localhost")
open.connection(x, "rb") でエラー: コネクションを開くことができません
> html <- read_html("http://intra.company.co.jp")
open.connection(x, "rb") でエラー: コネクションを開くことができません

プロキシを使わずに接続するドメインを、Sys.setenv関数を使って環境変数no_proxyに設定すればよい。複数ある場合はコンマで区切って指定する。

> Sys.setenv("no_proxy" = "localhost,intra.company.co.jp,123.456.78.9")
> html <- read_html("http://localhost")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"
> html <- read_html("http://intra.company.co.jp")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"
> html <- read_html("http://123.456.78.9")
> str(html)
List of 2
$ node:
$ doc :
- attr(*, "class")= chr [1:2] "xml_document" "xml_node"

URLにIPアドレスを直接指定する場合もあるだろうが、そのような場合read_htmlはまったく応答せずしばらくR自体が停止したような状態になってしまうが、上記の例のとおりにそのまま書き込めば、応答するようになる。

2026年2月16日 (月)

[R]文字列型ベクトルの文字列を簡単にテキストファイルに高速で書き込む

標準で搭載されているwrite関数やwrite.table関数を使ってもよいが、readrパッケージのwrite_delim関数、data.tableパッケージのfwrite関数を使うと、書き込む速度が断然速いため、こちらの使用を推奨する。ただし、デフォルトの動作やオプションの指定が関数によって異なるので注意。

以下は、write関数、write.table関数、write_delim関数、fwrite関数でそれぞれ文字型ベクトルの中身をファイルtemp.txtに書き込んだ例。最初に1回書き出した後に、それぞれ2回ずつ、書き込みに要した時間をsystem.time関数で計測している。Windows環境で文字符号化方式はUTF-8で行っている。UTF-8では漢字は一文字当たり3バイト。改行コードはCR+LFで、100万行出力しているため、ファイルサイズが(16×3+2)×10^6=50,000,000バイト≒47.7MBのファイルを出力している。

> .Platform$OS.type
[1] "windows"
> Sys.getlocale("LC_CTYPE")
[1] "Japanese_Japan.utf8"
> library(data.table)
> library(tidyverse)
> tempfile <- "temp.txt"
> s <- "アストラ役の遠藤綾さん、かわいい"
> s <- c(s, "ヴィタ役の日笠陽子さん、かわいい")
> s <- c(s, "松雀役の高森奈津美さん、かわいい")
> s <- c(s, "リフ役の瀬戸麻沙美さん、かわいい")
> nchar(s)
[1] 16 16 16 16
> ss <- sample(s, 10 ^ 6, replace = TRUE)
> length(ss)
[1] 1000000
> head(ss)
[1] "リフ役の瀬戸麻沙美さん、かわいい" "松雀役の高森奈津美さん、かわいい"
[3] "アストラ役の遠藤綾さん、かわいい" "松雀役の高森奈津美さん、かわいい"
[5] "リフ役の瀬戸麻沙美さん、かわいい" "リフ役の瀬戸麻沙美さん、かわいい"

data.tableパッケージのfwrite関数を使用した例。書き込む文字列をベクトルで与えることはできないため、データフレームに変換して引数に与えている。

> dtf <- data.frame(ss)
> fwrite(dtf, tempfile, col.names = FALSE, showProgress = FALSE)
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ fwrite(dtf, tempfile, col.names = FALSE, showProgress = FALSE)
+ )
ユーザ システム 経過
0.04 0.02 0.03
> system.time(
+ fwrite(dtf, tempfile, col.names = FALSE, showProgress = FALSE)
+ )
ユーザ システム 経過
0.05 0.05 0.05

readrパッケージのwrite_delim関数を使用した例。同様にベクトルを扱えないため、データフレームに変換して引数に与えている。

> dtf <- data.frame(ss)
> write_delim(dtf, tempfile, col_names = FALSE, progress = FALSE, eol = "\r\n")
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ write_delim(dtf, tempfile, col_names = FALSE, progress = FALSE, eol = "\r\n")
+ )
ユーザ システム 経過
0.24 0.21 0.19
> system.time(
+ write_delim(dtf, tempfile, col_names = FALSE, progress = FALSE, eol = "\r\n")
+ )
ユーザ システム 経過
0.36 0.36 0.14

write_table関数を使用した例。

> write.table(ss, tempfile, row.names = FALSE, col.names = FALSE, quote = FALSE)
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ write.table(ss, tempfile, row.names = FALSE, col.names = FALSE, quote = FALSE)
+ )
ユーザ システム 経過
1.03 0.06 1.11
> system.time(
+ write.table(ss, tempfile, row.names = FALSE, col.names = FALSE, quote = FALSE)
+ )
ユーザ システム 経過
0.94 0.06 1.03

write関数を使用した例。

> write(ss, tempfile)
> sprintf("%d", file.info(tempfile)$size)
[1] "50000000"
> system.time(
+ write(ss, tempfile)
+ )
ユーザ システム 経過
1.32 3.17 4.58
> system.time(
+ write(ss, tempfile)
+ )
ユーザ システム 経過
1.34 3.32 4.72

2回しか試行していないものの、書き込む速度は、おおよそfwrite関数、write_delim関数、write_table関数、write関数の順に早いことがわかる。

2026年2月15日 (日)

[R]文字列型ベクトルの文字列を文字符号化方式を指定してテキストファイルに書き込む

write関数を使うと、文字型ベクトルの文字列を簡単にテキストファイルに書き出すことができる。出力する文字符号化方式は、文字型ベクトルの指定にiconv関数を使用すればよい。

以下は、それぞれUTF-8とShift_JISで文字型ベクトルの中身をファイルtemp.txtに出力した例。nchar関数の出力どおり、文字数は合計37文字。最初に、この環境のデフォルトのUTF-8で出力する。

> .Platform$OS.type
[1] "windows"
> Sys.getlocale("LC_CTYPE")
[1] "Japanese_Japan.utf8"
> tempfile <- "temp.txt"
> s <- "カンタレラ役の中原麻衣さん、かわいい"
> s <- c(s, "セナディア役の鈴木みのりさん、かわいい")
> nchar(s)
[1] 18 19

書き出したファイルを、バイナリーファイルとしてraw形式で読み込んで文字符号化方式を確認する。UTF-8で「カ」は0xe382ab、「ン」は0xe383b3であり、また日本語は1文字当たり3バイトになり、2行出力したためそれぞれ改行コード(CR+LF)が2バイトずつ追加されるため、37×3+2×2=115バイトになるはず。

> write(s, file = tempfile)
> con <- file(tempfile, "rb")
> size <- file.info(tempfile)$size
> ra <- readBin(con, what = raw(), size)
> close(con)
> print(ra)
[1] e3 82 ab e3 83 b3 e3 82 bf e3 83 ac e3 83 a9 e5 bd b9 e3 81 ae e4 b8 ad
[25] e5 8e 9f e9 ba bb e8 a1 a3 e3 81 95 e3 82 93 e3 80 81 e3 81 8b e3 82 8f
[49] e3 81 84 e3 81 84 0d 0a e3 82 bb e3 83 8a e3 83 87 e3 82 a3 e3 82 a2 e5
[73] bd b9 e3 81 ae e9 88 b4 e6 9c a8 e3 81 bf e3 81 ae e3 82 8a e3 81 95 e3
[97] 82 93 e3 80 81 e3 81 8b e3 82 8f e3 81 84 e3 81 84 0d 0a
> length(ra)
[1] 115

次にShift_JISで出力し、出力したファイルを読み込みんで文字符号化方式を確認する。「カ」は0x834a、「ン」は0x8393であり、日本語は1文字当たり2バイトのため、37×2+2×2=78バイトになるはず。

> write(iconv(s, from = "UTF-8", to = "CP932"), file = tempfile)
> con <- file(tempfile, "rb")
> size <- file.info(tempfile)$size
> ra <- readBin(con, what = raw(), size)
> close(con)
> print(ra)
[1] 83 4a 83 93 83 5e 83 8c 83 89 96 f0 82 cc 92 86 8c b4 96 83 88 df 82 b3
[25] 82 f1 81 41 82 a9 82 ed 82 a2 82 a2 0d 0a 83 5a 83 69 83 66 83 42 83 41
[49] 96 f0 82 cc 97 e9 96 d8 82 dd 82 cc 82 e8 82 b3 82 f1 81 41 82 a9 82 ed
[73] 82 a2 82 a2 0d 0a
> length(ra)
[1] 78

2026年2月12日 (木)

[R]パスカルの三角形を作成する

choose関数とsapply関数を組合わせて使う。

> sapply(0:6, function(x) choose(x, 0:x))
[[1]]
[1] 1
[[2]]
[1] 1 1
[[3]]
[1] 1 2 1
[[4]]
[1] 1 3 3 1
[[5]]
[1] 1 4 6 4 1
[[6]]
[1] 1 5 10 10 5 1
[[7]]
[1] 1 6 15 20 15 6 1

2026年2月11日 (水)

[R]QR分解を行う

qr関数を使う。分解した行列はqr関数の戻り値からそれぞれqr.Q関数、qr.R関数を使うことで得ることができる。

m行n列の行列A(m >= n)が与えられたとき、Q^T Q = Iを満たす行列Qと上三角行列(対角成分より下の成分はすべて0の行列)Rを用いてA = Q Rと分解することを、行列AのQR分解という。QR分解はcomplete型とreduced型の2種類があり、それぞれ分解した行列の行数と列数が異なる。

complete型 A(m×n) = Q(m×m) R(m×n)
reduced型 A(m×n) = Q(m×n) R(n×n)

以下は適当な行列を作成してQR分解した例。Q^T Q = Iを満たしていることと、Q R = Aと元に戻ることも計算している。qr.Q関数とqr.R関数にそれぞれcompleteオプションにTRUEを指定すると、complete型の計算を行う。何も指定しなければreduced型の計算結果が返される。

> m <- 4
> n <- 3
> aa <- matrix(0.0, m, n)
> for (i in 1:m) for (j in 1:n) aa[i, j] <- (-1) ^ i * choose(2 * i + j, i)
> print(aa)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330
>
> # complete型 A(m×n) = Q(m×m) R(m×n)
> r <- qr(aa)
> qq <- qr.Q(r, complete = TRUE) # m×m
> rr <- qr.R(r, complete = TRUE) # m×n
> print(qq)
[,1] [,2] [,3] [,4]
[1,] -0.02286814 0.3344769 0.7843075 0.5219808
[2,] 0.07622713 -0.5474374 -0.2854080 0.7829713
[3,] -0.26679495 0.7243109 -0.5399946 0.3355591
[4,] 0.96046183 0.2526086 -0.1086731 0.0434984
> print(rr)
[,1] [,2] [,3]
[1,] 131.1869 217.872381 341.0782902
[2,] 0.0000 2.936931 9.3501598
[3,] 0.0000 0.000000 -0.4176769
[4,] 0.0000 0.000000 0.0000000
> print(t(qq) %*% qq)
[,1] [,2] [,3] [,4]
[1,] 1.000000e+00 -8.326673e-17 -2.220446e-16 -7.632783e-17
[2,] -8.326673e-17 1.000000e+00 9.714451e-17 2.775558e-17
[3,] -2.220446e-16 9.714451e-17 1.000000e+00 1.257675e-16
[4,] -7.632783e-17 2.775558e-17 1.257675e-16 1.000000e+00
> print(qq %*% rr)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330
>
> # reduced型 A(m×n) = Q(m×n) R(n×n)
> r <- qr(aa)
> qq <- qr.Q(r) # m×n
> rr <- qr.R(r) # n×n
> print(qq)
[,1] [,2] [,3]
[1,] -0.02286814 0.3344769 0.7843075
[2,] 0.07622713 -0.5474374 -0.2854080
[3,] -0.26679495 0.7243109 -0.5399946
[4,] 0.96046183 0.2526086 -0.1086731
> print(rr)
[,1] [,2] [,3]
[1,] 131.1869 217.872381 341.0782902
[2,] 0.0000 2.936931 9.3501598
[3,] 0.0000 0.000000 -0.4176769
> print(t(qq) %*% qq)
[,1] [,2] [,3]
[1,] 1.000000e+00 -8.326673e-17 -2.220446e-16
[2,] -8.326673e-17 1.000000e+00 9.714451e-17
[3,] -2.220446e-16 9.714451e-17 1.000000e+00
> print(qq %*% rr)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330

qr関数にLAPACKオプションでTRUEを指定すると(デフォルトはFALSE)、計算にLAPACKを使いピボット選択が行われる(Using LAPACK (including in the complex case) uses column pivoting and does not attempt to detect rank-deficient matrices.)。このピボットの情報は、qr関数の戻り値のpivotというベクトルに含まれている。

> print(aa)
[,1] [,2] [,3]
[1,] -3 -4 -5
[2,] 10 15 21
[3,] -35 -56 -84
[4,] 126 210 330
> r <- qr(aa, LAPACK = TRUE)
> print(r$pivot)
[1] 3 1 2
> qq <- qr.Q(r)
> rr <- qr.R(r)
> print(qq)
[,1] [,2] [,3]
[1,] -0.01465387 0.2996579 0.7984525
[2,] 0.06154627 -0.5360454 -0.3095536
[3,] -0.24618510 0.7547242 -0.5071335
[4,] 0.96715574 0.2307639 -0.0972919
> print(rr)
[,1] [,2] [,3]
[1,] 341.2067 131.137526 217.8708796
[2,] 0.0000 -3.598527 -3.0434558
[3,] 0.0000 0.000000 0.1310637
> print(t(qq) %*% qq)
[,1] [,2] [,3]
[1,] 1.000000e+00 5.551115e-17 1.387779e-16
[2,] 5.551115e-17 1.000000e+00 -9.020562e-17
[3,] 1.387779e-16 -9.020562e-17 1.000000e+00
> print(aa[, r$pivot])
[,1] [,2] [,3]
[1,] -5 -3 -4
[2,] 21 10 15
[3,] -84 -35 -56
[4,] 330 126 210
> print(qq %*% rr)
[,1] [,2] [,3]
[1,] -5 -3 -4
[2,] 21 10 15
[3,] -84 -35 -56
[4,] 330 126 210

2026年2月10日 (火)

[R]LU分解を行う

Matrixパッケージのlu関数を使う。LU分解したそれぞれの行列を取り出すには、同パッケージに含まれているexpand関数を使う。

n次の正方行列Aが与えられたとき、下三角行列Lと上三角行列Uを用いてA = L Uと分解することを、行列AのLU分解という。lu関数は置換行列Pを用いてP A = L Uと分解する。戻り値はLが下三角行列、Uが上三角行列、Pが置換行列。以下は4次の正方行列のパスカル行列をLU分解した例。最後に、元の行列に戻るかどうか計算している。

> n <- 4
> aa <- matrix(1, n, n)
> for (i in 2:n) for (j in 2:n) aa[i, j] <- aa[i, j - 1] + aa[i - 1, j]
> print(aa)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 1 2 3 4
[3,] 1 3 6 10
[4,] 1 4 10 20
> library(Matrix)
> r <- expand(lu(aa))
> print(r$L)
4 x 4 Matrix of class "dtrMatrix" (unitriangular)
[,1] [,2] [,3] [,4]
[1,] 1.0000000 . . .
[2,] 1.0000000 1.0000000 . .
[3,] 1.0000000 0.6666667 1.0000000 .
[4,] 1.0000000 0.3333333 1.0000000 1.0000000
> print(r$U)
4 x 4 Matrix of class "dtrMatrix"
[,1] [,2] [,3] [,4]
[1,] 1.0000000 1.0000000 1.0000000 1.0000000
[2,] . 3.0000000 9.0000000 19.0000000
[3,] . . -1.0000000 -3.6666667
[4,] . . . 0.3333333
> print(r$P)
4 x 4 sparse Matrix of class "pMatrix"
[1,] | . . .
[2,] . . . |
[3,] . . | .
[4,] . | . .
> print(solve(r$P) %*% r$L %*% r$U)
4 x 4 Matrix of class "dgeMatrix"
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 1 2 3 4
[3,] 1 3 6 10
[4,] 1 4 10 20

2026年2月 5日 (木)

[R]パスカル行列を求める

パスカル行列は正定値対称行列であり、下三角コレスキー因子(パスカル行列P = L L'を満たす下三角行列L)を求めて計算することで作成している。以下は、lapply関数を使用して5次の正方行列であるパスカル行列を作成した例。

> n <- 5
> lis <- lapply(0:(n - 1), function(x) choose(x, 0:x))
> ll <- diag(0, n)
> for (i in 1:n) for (j in 1:i) ll[i, j] <- lis[[i]][j]
> print(ll)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 0 0 0
[2,] 1 1 0 0 0
[3,] 1 2 1 0 0
[4,] 1 3 3 1 0
[5,] 1 4 6 4 1
> pp <- ll %*% t(ll)
> print(pp)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 1 1
[2,] 1 2 3 4 5
[3,] 1 3 6 10 15
[4,] 1 4 10 20 35
[5,] 1 5 15 35 70

2026年2月 3日 (火)

[R]Webサイトのページを読み取る

rvectパッケージのread_html関数を使う。以下は、宮内庁の公式ウェブサイトの、天皇皇后両陛下の紹介ページを抜き出した例。戻り値はリスト。専用の関数を使うことで、当該ページ内の各種情報(表など)をきれいに取り出すことができる。

> library(rvest)
> r <- read_html("https://www.kunaicho.go.jp/about/history/history02.html")
> typeof(r)
[1] "list"
> mode(r)
[1] "list"
> class(r)
[1] "xml_document" "xml_node"

2026年2月 2日 (月)

[R]同じ文字列を繰り返した文字列を作成する

stirngrパッケージのstr_dup関数を使う。

> library(stringr)
> s <- "崩壊3rd"
> str_dup(s, 1:3)
[1] "崩壊3rd" "崩壊3rd崩壊3rd" "崩壊3rd崩壊3rd崩壊3rd"
> s <- c("ゼンレスゾーンゼロ", "崩壊3rd", "鳴潮")
> str_dup(s, 1:3)
[1] "ゼンレスゾーンゼロ" "崩壊3rd崩壊3rd" "鳴潮鳴潮鳴潮"

« 2026年1月 | トップページ | 2026年3月 »

無料ブログはココログ

■■

■■■