« 2025年10月 | トップページ | 2025年12月 »

2025年11月28日 (金)

[R]文字列を1文字ずつに分割する

strsplit関数を使う。分割指定の正規表現パターン(第2引数)に "" を指定すると、第1引数に与えた文字列を1文字ずつに分割する。

> s <- c("和多田美咲さん、かわいい", "優木かなさん、かわいい")
> print(s)
[1] "和多田美咲さん、かわいい" "優木かなさん、かわいい"
> strsplit(s, "")
[[1]]
[1] "和" "多" "田" "美" "咲" "さ" "ん" "、" "か" "わ" "い" "い"
[[2]]
[1] "優" "木" "か" "な" "さ" "ん" "、" "か" "わ" "い" "い"

2025年11月24日 (月)

[R]複数の文字列による重複組合せを作成する

重複組合せとは、複数のものから同じものを繰り返しとることを許してとった組合せのこと。例えば、aとbから3個とる重複組合せは、aaa, aab, abb, bbbの4個となる。

gtoolsパッケージのcombinations関数を使う。repeats.allowオプションをTRUEにすること。

> library(gtools)
> ss <- c("a", "b")
> combinations(2, 3, ss, repeats.allow = TRUE)
[,1] [,2] [,3]
[1,] "a" "a" "a"
[2,] "a" "a" "b"
[3,] "a" "b" "b"
[4,] "b" "b" "b"

2025年11月22日 (土)

[R]複数の文字列による重複順列を得る

重複順列とは、複数のものから同じものを繰り返しとることを許してとって並べた順列のこと。高校で学ぶ数学で重複順列は「n個からr個とった重複順列」という。

以下では、与えれたn個の文字列からn個とった重複順列を求めている。例として"A"と"B"の2つの文字列であれば、"AA", "AB", "BA", "BB"の4個の文字列を作成するということ。"A", "B", "C"の3つであれば、"AAA", "AAB", "AAC", "ABA", …, "CCB", "CCC"の27個となる。

gtoolsパッケージのpermutations関数を使う。repeats.allowオプション(デフォルト:FALSE)がFALSEの場合は、繰り返し取ることが認められなくなり、順番を考慮した組合せになってしまうため、TRUEとすること。戻り値は配列のため、これをapply関数を利用してpaste0関数で連結すれば、ベクトルでまとめて得られる。

> library(gtools)
> ss <- c("A", "B")
> permutations(2, 2, ss)
[,1] [,2]
[1,] "A" "B"
[2,] "B" "A"
> ar <- permutations(2, 2, ss)
> apply(ar, 1, function(s) {return(paste0(s, collapse = ""))})
[1] "AB" "BA"
> ss <- c("A", "B", "C")
> permutations(3, 3, ss)
[,1] [,2] [,3]
[1,] "A" "B" "C"
[2,] "A" "C" "B"
[3,] "B" "A" "C"
[4,] "B" "C" "A"
[5,] "C" "A" "B"
[6,] "C" "B" "A"
> permutations(3, 3, ss, repeats.allow = TRUE)
[,1] [,2] [,3]
[1,] "A" "A" "A"
[2,] "A" "A" "B"
[3,] "A" "A" "C"
[4,] "A" "B" "A"
[5,] "A" "B" "B"
[6,] "A" "B" "C"
[7,] "A" "C" "A"
[8,] "A" "C" "B"
[9,] "A" "C" "C"
[10,] "B" "A" "A"
[11,] "B" "A" "B"
[12,] "B" "A" "C"
[13,] "B" "B" "A"
[14,] "B" "B" "B"
[15,] "B" "B" "C"
[16,] "B" "C" "A"
[17,] "B" "C" "B"
[18,] "B" "C" "C"
[19,] "C" "A" "A"
[20,] "C" "A" "B"
[21,] "C" "A" "C"
[22,] "C" "B" "A"
[23,] "C" "B" "B"
[24,] "C" "B" "C"
[25,] "C" "C" "A"
[26,] "C" "C" "B"
[27,] "C" "C" "C"
> ar <- permutations(3, 3, ss, repeats.allow = TRUE)
> apply(ar, 1, function(s) {return(paste0(s, collapse = ""))})
[1] "AAA" "AAB" "AAC" "ABA" "ABB" "ABC" "ACA" "ACB" "ACC" "BAA"
[11] "BAB" "BAC" "BBA" "BBB" "BBC" "BCA" "BCB" "BCC" "CAA" "CAB"
[21] "CAC" "CBA" "CBB" "CBC" "CCA" "CCB" "CCC"

2025年11月21日 (金)

[R]行列の要素を抜き出してベクトルにする

as.vector関数を使う。行列の列ベクトルごとに順に要素を抜き出すため、行ベクトルごとに抜き出したい場合は、引数に与える行列を転置行列にしておくこと。

> mx <- matrix(1:12, nrow = 3, ncol = 4)
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> v <- as.vector(mx)
> print(v)
[1] 1 2 3 4 5 6 7 8 9 10 11 12
> v <- as.vector(t(mx))
> print(v)
[1] 1 4 7 10 2 5 8 11 3 6 9 12

2025年11月18日 (火)

[R]ベクトルから条件に一致する要素のインデックスを抽出する

which関数を使う。一致する要素が無い場合は、長さが0のベクトルを返す。戻り値は、指定した条件に一致する要素のインデックス(構成する要素に割り振られた1から始まる連番)であり、要素そのものではないことに注意。

> n <- 2 ^ (0:12)
> print(n)
[1] 1 2 4 8 16 32 64 128 256 512 1024 2048 4096
> which(n > 1000)
[1] 11 12 13
> which(n > 10000)
integer(0)
> length(which(n > 10000))
[1] 0
> ss <- c("鈴木みのり", "鈴木みのり", "瀬戸麻沙美", "のぐちゆり", "和多田美咲")
> which(ss == "瀬戸麻沙美")
[1] 3
> which(ss == "鈴木みのり" | ss == "のぐちゆり")
[1] 1 2 4

2025年11月17日 (月)

[R]ベクトルから条件に一致する要素を抽出する

ベクトルはインデックス(構成する要素に割り振られた1から始まる連番)の指定に、ベクトルと同じ長さの論理型ベクトルを与えると、ブール値がTRUEの要素だけを取り出すため、これを利用する。一致する要素が無い場合は、長さが0のベクトルを返す。

> n <- 2 ^ (0:12)
> print(n)
[1] 1 2 4 8 16 32 64 128 256 512 1024 2048 4096
> n > 1000
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
> n[n > 1000]
[1] 1024 2048 4096
> n[n > 10000]
numeric(0)
> length(n[n > 10000])
[1] 0
> ss <- c("鈴木みのり", "鈴木みのり", "瀬戸麻沙美", "のぐちゆり", "和多田美咲")
> ss[ss == "瀬戸麻沙美"]
[1] "瀬戸麻沙美"
> ss[ss == "鈴木みのり" | ss == "のぐちゆり"]
[1] "鈴木みのり" "鈴木みのり" "のぐちゆり"
> ss[grep("美", ss)]
[1] "瀬戸麻沙美" "和多田美咲"

2025年11月 9日 (日)

[R]特定の文字列で始まる(始まらない)文字列を抽出する

正規表現で^記号は文字列の先頭を表すため、これを正規表現パターンに利用する。invertオプション(デフォルト:FALSE)をTRUEにすると、指定した正規表現パターンに一致しない要素を返す。

> ss <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "のぐちゆり", "和多田美咲")
> # 「の」で始まる氏名
> grep("^の", ss, value = TRUE)
[1] "のぐちゆり"
> # 「の」で始まらない氏名
> grep("^の", ss, invert = TRUE, value = TRUE)
[1] "石見舞菜香" "鈴木みのり" "瀬戸麻沙美" "和多田美咲"
> # 「の」を含むが「の」で始まらない氏名
> grep("^.+の", ss, value = TRUE)
[1] "鈴木みのり"

ルックアラウンド式(lookaround expression)を使うこともできるが、perlオプション(デフォルト:FALSE)をTRUEにする必要がある。

> grep("^(?=の)", ss, value = TRUE)
grep("^(?=の)", ss, value = TRUE) でエラー:
不正な正則表現です、理由は 'Invalid regexp'
> # 「の」で始まる氏名 ※肯定的な先読み
> grep("^(?=の)", ss, perl = TRUE, value = TRUE)
[1] "のぐちゆり"
> # 「の」で始まらない氏名 ※否定的な先読み
> grep("^(?!の)", ss, perl = TRUE, value = TRUE)
[1] "石見舞菜香" "鈴木みのり" "瀬戸麻沙美" "和多田美咲"

ルックアラウンド式については、以下のページの「Lookaround の概要」を参照のこと。
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference#lookarounds-at-a-glance

2025年11月 8日 (土)

[R]特定の文字列で終わる(終わらない)文字列を抽出する

正規表現で$記号は文字列の末尾を表すため、これを正規表現パターンに利用する。invertオプション(デフォルト:FALSE)をTRUEにすると、指定した正規表現パターンに一致しない要素を返す。

> ss <- c("石見舞菜香", "鈴木みのり", "瀬戸麻沙美", "のぐちゆり", "和多田美咲")
> # 「美」で終わる氏名
> grep("美$", ss, value = TRUE)
[1] "瀬戸麻沙美"
> # 「美」で終わらない氏名
> grep("美$", ss, invert = TRUE, value = TRUE)
[1] "石見舞菜香" "鈴木みのり" "のぐちゆり" "和多田美咲"
> # 「美」を含むが「美」で終わらない氏名
> grep("美.+$", ss, value = TRUE)
[1] "和多田美咲"

ルックアラウンド式(lookaround expression)を使うこともできるが、perlオプション(デフォルト:FALSE)をTRUEにする必要がある。

> grep("(?<=美)$", ss, value = TRUE)
grep("(?<=美)$", ss, value = TRUE) でエラー:
不正な正則表現です、理由は 'Invalid regexp'
> # 「美」で終わる氏名 ※肯定的な後読み
> grep("(?<=美)$", ss, perl = TRUE, value = TRUE)
[1] "瀬戸麻沙美"
> # 「美」で終わらない氏名 ※否定的な後読み
> grep("(?<!美)$", ss, perl = TRUE, value = TRUE)
[1] "石見舞菜香" "鈴木みのり" "のぐちゆり" "和多田美咲"

ルックアラウンド式については、以下のページの「Lookaround の概要」を参照のこと。
https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference#lookarounds-at-a-glance

2025年11月 7日 (金)

[R]ファイルやディレクトリのパスを連結する

file.path関数を使う。以下は、自動的に削除される一時ディレクトリを利用し、temp1.txtとtemp2.txtという2つのテキストファイルについて、パスを連結して出力と読み込み行った例。一方はfile.path関数を使って連結し、もう一方はpaste0関数を使用して手動で文字列として連結して行っている(ディレクトリの区切り記号は.Platform$file.sepを使用)。いずれも問題なく読み書きできることが分かる。

> tempd <- tempdir()
> # [一時ファイル1と2の作成とファイルへの書き出し]
> f1 <- file.path(tempd, "temp1.txt")
> f2 <- sprintf(paste0(tempd, .Platform$file.sep, "temp2.txt"))
> write("スノウブレイクのリフ-ムゲン知眼役の瀬戸麻紗美さん", file = f1)
> write("かわいい", file = f1, append = TRUE)
> write("マクロスΔのフレイア役の鈴木みのりさん", file = f2)
> write("かわいい", file = f2, append = TRUE)
> # [一時ファイル1と2からの読み込み]
> lns <- scan(f1, what = character(), quiet = TRUE)
> print(lns)
[1] "スノウブレイクのリフ-ムゲン知眼役の瀬戸麻紗美さん"
[2] "かわいい"
> lns <- scan(f2, what = character(), quiet = TRUE)
> print(lns)
[1] "マクロスΔのフレイア役の鈴木みのりさん" "かわいい"

2025年11月 5日 (水)

[R]行列のアダマール積を求める

*演算子を使う。それぞれ行列を指定する。アダマール積の定義(行の数と列の数が同じ行列同士の各成分を掛ける)から、二つの行列の行数と列数が一致しない場合はエラーが発生する。

> mxxx <- matrix(c(1, 2, 2, 2, 3, 5, 3, 4, 6), nrow = 3, ncol = 3)
> mxxx
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 3 4
[3,] 2 5 6
> mxxx * mxxx
[,1] [,2] [,3]
[1,] 1 4 9
[2,] 4 9 16
[3,] 4 25 36
> mxaa <- matrix(c(1, 2), nrow = 1, ncol = 2)
> mxbb <- matrix(c(1, 2), nrow = 2, ncol = 1)
> mxaa
[,1] [,2]
[1,] 1 2
> mxbb
[,1]
[1,] 1
[2,] 2
> mxaa * mxbb
mxaa * mxbb でエラー: 適切な配列ではありません

2025年11月 4日 (火)

[R]行列の積を求める

行列Aと行列Bの積ABを求めるには、%*%演算子を使う。行列の乗法は、左側の行列Aの列の数と右側の行列Bの行の数が一致している場合のみ求めることができる(そのような定義になっている)。最後の例のとおり、左右の列数と行数が一致しない場合はエラーが発生する。

> mxaa1 <- matrix(c(1, 2, 2, 2, 3, 5, 3, 4, 6), nrow = 3, ncol = 3)
> mxbb1 <- matrix(c(1, 0, 0, 0, 1, 1, 1, 0, 1), nrow = 3, ncol = 3)
> mxaa1
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 2 3 4
[3,] 2 5 6
> mxbb1
[,1] [,2] [,3]
[1,] 1 0 1
[2,] 0 1 0
[3,] 0 1 1
> mxaa1 %*% mxbb1
[,1] [,2] [,3]
[1,] 1 5 4
[2,] 2 7 6
[3,] 2 11 8
> mxaa2 <- matrix(c(1, 0, 0, 1, 1, 0), nrow = 2, ncol = 3)
> mxbb2 <- matrix(c(1, 0, 0, 2, 1, -2), nrow = 3, ncol = 2)
> mxaa2
[,1] [,2] [,3]
[1,] 1 0 1
[2,] 0 1 0
> mxbb2
[,1] [,2]
[1,] 1 2
[2,] 0 1
[3,] 0 -2
> mxaa2 %*% mxbb2
[,1] [,2]
[1,] 1 0
[2,] 0 1
> mxaa1 %*% mxaa2
mxaa1 %*% mxaa2 でエラー: 適切な引数ではありません

« 2025年10月 | トップページ | 2025年12月 »

無料ブログはココログ

■■

■■■