« 2022年6月 | トップページ | 2022年8月 »

2022年7月31日 (日)

[R]順列を求める

Rには標準では順列の総数を求める関数は搭載されていない。階乗を使った式で表すことができるため、階乗を求めるfactorial関数を使用して、順列の総数を求める関数permuを自作する。

> permu <- function(n, r) {factorial(n) / factorial(n - r)}

5P2(=20)、5P3(=60)を求めてみる。

> permu(5, 2)
[1] 20
> permu(5, 3)
[1] 60

なおn > r、0!=1である。n=rの場合は、階乗そのものの計算になる。

2022年7月30日 (土)

[R]日時の計算を行う

difftime関数を使う。引数に、比較をする日、基準とする日の順に日付オブジェクトを与える。unitsオプションにいろいろ与えることで、返却値の単位を指定することができる。

> dt1 <- as.Date("2002-01-02")
> dt2 <- as.Date("2002-01-05")
> difftime(dt2, dt1)
Time difference of 3 days
> difftime(dt2, dt1, units = "hours")
Time difference of 72 hours
> difftime(dt2, dt1, units = "days")
Time difference of 3 days
> difftime(dt2, dt1, units = "hours")
Time difference of 72 hours

返却値の値は計算に使用することができる。

> n <- difftime(dt2, dt1, units = "hours")
> print(n / 8)
Time difference of 9 hours

2022年7月29日 (金)

[R]ベクトルの中身をテキストファイルに書き込む

write関数を使う。次のベクトルの中身をテキストファイル「output.txt」に書き込む

> s <- c("a", "AB", "あいう", "", "阿伊宇")
> write(s, file = "output.txt")

カレントディレクトリにファイル「output.txt」がつくられ、一要素一行の以下のような中身になっているはず。同名ファイルが既にある場合は、そのファイルはいったん削除され、新たにファイルがつくられる。

a
AB
あいう

阿伊宇

既にある同名ファイルに追加したい場合は、appendオプションをTRUEにする。

> write(s, file = "output.txt", append = TRUE)

ファイルoutput.txtの中身は以下のようなったはず。

a
AB
あいう
阿伊宇
a
AB
あいう
阿伊宇

これまでは文字列型ベクトルを出力していたが、数値型ベクトルの場合は次のように書き込まれる。

> n <- 1:3
> write(n, file = "output.txt")
1 2 3

要素と要素の間のセパレーターはデフォルトでは空白一つ(0x20)。これを変えるにはsepオプションにセパレーターを指定する。

> write(n, file = "output.txt", sep = "\n")
1
2
3

2022年7月28日 (木)

[R]テキストファイルの中身を簡単に読み込む

scan関数を使うとテキストファイルの中身をベクトルに簡単に読み込むことができる。以下の6行からなるテキストファイルを「text.txt」として保存する。

A
abc
あいう
阿伊宇

123xyz

読み込んでみる。

> lines <- scan("text.txt", what = character(0))
Read 5 items
> print(lines)
[1] "A" "abc" "あいう" "阿伊宇" "123xyz"

whatオプションをcharacter(0)とすることで、すべてを文字列で読み込む。デフォルトでは一行一要素でベクトルに代入される。空行(5行目)はデフォルトでは読み込まれない。これを読み込むようにするには、blank.lines.skipオプションをFALSEにする。

> lines <- scan("text.txt", what = character(0), blank.lines.skip = FALSE)
Read 6 items
> print(lines)
[1] "A" "abc" "あいう" "阿伊宇" "" "123xyz"

「Read 6 items」を表示しなくするには、quietオプションをTRUEにする。

> lines <- scan("text.txt", what = character(0), quiet = TRUE)
> print(lines)
[1] "A" "abc" "あいう" "阿伊宇" "123xyz"

2022年7月27日 (水)

[R]リストをベクトルに変換する

unlist関数を使う。オブジェクトの方が異なる場合は、一つに揃えられるので注意。以下の例では、数値型が文字列型に強制変換されて、ベクトル化されている。

> lst <- list(1:3, c("A", "B", "C"))
> print(lst)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
> unlist(lst)
[1] "1" "2" "3" "A" "B" "C"

2022年7月26日 (火)

[R]リストから要素を取り出す

[ ]演算子と[[ ]]演算子を使う。それぞれインデックスを与える。[ ]演算子は要素をリストで、[[ ]]演算子は要素をベクトルで返す。

> n <- 1:3
> s <- c("A", "B", "C")
> lst <- list(n, s)
> lst[2]
[[1]]
[1] "A" "B" "C"
> lst[[2]]
[1] "A" "B" "C"

2022年7月25日 (月)

[R]リストの宣言と初期化

list関数を使う。

> n <- 1:3
> s <- c("A", "B", "C")
> lst <- list(n, s)
> print(lst)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"

2022年7月24日 (日)

[R]文字型ベクトルの宣言と初期化

文字や文字列を扱うための変数(ベクトル)を使うには、その文字列を格納する領域を用意して、それに名前を付ける必要がある。これを宣言という。

二重引用符”で囲んだ文字の並びを文字列リテラルといい、この文字列リテラルをc関数などを使うことにより宣言する。二重引用符の間に何も含まれない場合は、長さ0の文字列となる。

> s
エラー: オブジェクト 's' がありません
> s <- "あいう"
> print(s)
[1] "あいう"
> s <- c("A", "AB", "", "あ")
> print(s)
[1] "A" "AB" "" "あ"

character関数に数値を与えると、長さが0の文字列を指定した個数だけ作成する。文字列を1つも含まない文字型ベクトルを作るには引数に0を与える。ベクトルの長さを得るにはlength関数を使う。

> length(c("A", "AB", "あ", "z"))
[1] 4
> character(3)
[1] "" "" ""
> length(character(3))
[1] 3
> character(0)
character(0)
> length(character(0))
[1] 0

2022年7月23日 (土)

[R]日付型ベクトルの宣言と初期化

日付を扱うための変数(ベクトル)を使うには、その日付を格納する領域を用意して、それに名前を付ける必要がある。これを宣言という。

日付型変数(ベクトル)はas.Date関数に書式に従った文字列リテラルを与えることで宣言することができる。ベクトルの長さを得るにはlength関数を使う。

> dt <- as.Date(c("2001-01-01", "2001-01-03"))
> print(dt)
[1] "2001-01-01" "2001-01-03"
> length(dt)
[1] 2

2022年7月21日 (木)

[R]ベクトルの要素をソートする

並び替えた結果を値で得る場合はsort関数を、その並び替えられたインデックスが欲しい場合はorder関数を使う。デフォルトでは昇順で返す。降順で返す場合はdecreasingにTRUEを与える。

> d <- c(4.0, 0.0, -3.2, 5.1)
> sort(d)
[1] -3.2 0.0 4.0 5.1
> order(d)
[1] 3 2 1 4
> sort(d, decreasing = TRUE)
[1] 5.1 4.0 0.0 -3.2
> order(d, decreasing = TRUE)
[1] 4 1 2 3

文字列にも使える。

> s <- c("A", "AB", "ABC", "ab", "あい", "阿")
> sort(s)
[1] "A" "ab" "AB" "ABC" "あい" "阿"
> order(s)
[1] 1 4 2 3 5 6
> sort(s, decreasing = TRUE)
[1] "阿" "あい" "ABC" "AB" "ab" "A"
> order(s, decreasing = TRUE)
[1] 6 5 3 2 4 1

2022年7月20日 (水)

[R]日付を文字列に変換する

format関数を使う。format関数はベクトルを扱える。文字列に変換する書式はformatオプションを使うことができる。

> da <- as.Date(c("2014-12-01", "2014-12-31"))
> format(da)
[1] "2014-12-01" "2014-12-31"
> mode(format(da))
[1] "character"
> class(format(da))
[1] "character"
> format(da, format = "%Y/%m/%d")
[1] "2014/12/01" "2014/12/31"

2022年7月19日 (火)

[R]文字列を数値に変換する

as.numeric関数を使う。

> s <- c("1", "2.2", "-3.3")
> as.numeric(s)
[1] 1.0 2.2 -3.3
> s <- c("A", "2.2", "- 3.3")
> as.numeric(s)
[1] NA 2.2 NA
警告メッセージ:
強制変換により NA が生成されました

数値に変換できる文字列は浮動小数点数に変換される。数値に変換できない文字列はNAになる。

整数もしくは浮動小数点数に恣意的に変換したい場合はas.integer関数もしくはas.double関数を使う。

> s <- c("0", "1", "2.2", "-3.3")
> as.integer(s)
[1] 0 1 2 -3
> as.double(s)
[1] 0.0 1.0 2.2 -3.3

2022年7月18日 (月)

[R]文字列に特定の文字列が含まれているか調べる

grep関数を使う。以下、使用例。

> s <- c("ABC", "abc", "ABc")
> grep("AB", s)
[1] 1 3
> grep("c", s)
[1] 2 3
> grep("c", s, value = TRUE)
[1] "abc" "ABc"

最初の例では文字列「AB」が含まれるのは1番目と3番目の要素のため、1と3が返される。最後の例ではvalueオプションをTRUEにすることで、インデックスではなく含まれる要素の値そのものを返している。

> grep("d", s)
integer(0)
> grep("d", s, value = TRUE)
character(0)

指定した文字列が見つからなければ空のベクトルが返される。

検索に、正規表現も使える。第一引数にパターンを指定する。

> s <- c("あいう", "いうあ", "うあい")
> grep("^あ", s, value = TRUE)
[1] "あいう"
> grep("あ$", s, value = TRUE)
[1] "いうあ"
> grep("[あ]", s, value = TRUE)
[1] "あいう" "いうあ" "うあい"

2022年7月17日 (日)

[R]文字列を比較する

==演算子を使う。完全に一致すればTRUE、一文字でも異なればFALSEを返す。

> "A" == "A"
[1] TRUE
> "A" == "B"
[1] FALSE
> "ABC" == "ABC"
[1] TRUE
> "ABc" == "ABC"
[1] FALSE
> "ABC" == "ABCD"
[1] FALSE
> "ABCD" == "ABC"
[1] FALSE

ベクトルを利用した比較もできる。

> s1 <- c("A", "B", "C")
> s2 <- c("A", "B", "c")
> s1 == s2
[1] TRUE TRUE FALSE

[R]ベクトルの要素をソートする

sort関数を使う。数値も文字列も並び替えることができる。逆順に並び替えるときはdecreasingオプションにTRUEを与える。



> n <- c(1, 0, 4, 9)
> n
[1] 1 0 4 9
> sort(n)
[1] 0 1 4 9
> sort(n, decreasing = TRUE)
[1] 9 4 1 0
> s <- c("x", "z", "abc", "ab", "A")
> s
[1] "x" "z" "abc" "ab" "A"
> sort(s)
[1] "A" "ab" "abc" "x" "z"

2022年7月15日 (金)

[R]ベクトルの長さ(要素数)を調べる

length関数を使う。

> d <- c(1.0, 2.0, 3.0)
> length(d)
[1] 3
> n <- 0:255
> length(n)
[1] 256
> d <- double()
> length(d)
[1] 0

最後の例のとおり、何も代入されていない空のベクトルは長さが0となる。

2022年7月14日 (木)

[R]累乗を計算する

^演算子か**演算子を使う。

> 2 ^ 2
[1] 4
> 2 ^ 3
[1] 8
> 2 ^ -2
[1] 0.25
> 2 ** 2
[1] 4
> 2 ** 3
[1] 8
> 2 ** -2
[1] 0.25

2022年7月13日 (水)

[R]平方根を計算する

sqrt関数を使う。

> sqrt(2)
[1] 1.414214
> sqrt(3)
[1] 1.732051
> sqrt(4)
[1] 2
> sqrt(0)
[1] 0
> sqrt(1 / 2)
[1] 0.7071068
> sqrt(-2)
[1] NaN
警告メッセージ:
sqrt(-2) で: 計算結果が NaN になりました

2022年7月12日 (火)

[R]絶対値を取得する

abs関数を使う。引数には数値型ベクトルを与える。

> abs(10)
[1] 10
> abs(-20)
[1] 20
> abs(3.3) - abs(-3.3)
[1] 0
> abs(c(100, -200))
[1] 100 200

2022年7月11日 (月)

[R]文字列の指定した一部を取得する

substr関数を使う。引数には抜き出す文字列の何文字目(1~)から何文字目までと指定する。

> s <- c("ABCDEFG", "あいうえお", "阿伊ab")
> substr(s, 2, 4)
[1] "BCD" "いうえ" "伊ab"

何文字目の指定にめちゃくちゃな値を与えると、取り出せる分を取り出してくれる。

> substr(s, 2, -2)
[1] "" "" ""
> substr(s, -3, 2)
[1] "AB" "あい" "阿伊"
> substr(s, 2, 10)
[1] "BCDEFG" "いうえお" "伊ab"

ベクトルの機能を活用すれば、例えば後ろから2文字だけ抜き出すといったこともできる。

> substr(s, nchar(s) - 1, nchar(s))
[1] "FG" "えお" "ab"

2022年7月10日 (日)

[R]文字列を特定の文字または文字列で分割する

strsplit関数を使う。分割する文字列はベクトルで与えることができる。戻りはリスト。分割させる文字または文字列は正規表現で与えることができる。

> s <- c("A B C", " D E  F ")
> strsplit(s, " ")
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "" "D" "E" "" "F"

上記の例では1つの空白(0x20)で分割しようとしたが、ベクトルの2番目の要素は与えた文字列の先頭や最後に空白が含まれており、間の空白も1文字とは限らないので、分割がうまくいっていない。このような場合はあらかじめ前後の空白をtrimws関数で取り除き、分割パターンは正規表現で「[ ]+」(1つ以上の連続した空白(0x20))を与えればよい。

> strsplit(trimws(s), "[ ]+")
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "D" "E" "F"

strsplitの戻り値はリストであり、これをベクトルにする場合はunlist関数を使う。

> unlist(strsplit(trimws(s), "[ ]+"))
[1] "A" "B" "C" "D" "E" "F"

規則性なく空白が含まれるCSVの文字列の場合は、以下のような分割パターンを正規表現で与えれば、うまく分割することができる。

> s <- " A, B,C "
> strsplit(trimws(s), "[ ,]+")
[[1]]
[1] "A" "B" "C"

2022年7月 9日 (土)

[R]行列から特定の行か特定の列のみ取り出す

インデックスを指定する際に、数値を与えずに空欄のままにする。以下の例ではそれぞれ2行目のみ、3列目のみを取り出している。

> mx <- matrix(1:9, 3, 3)
> print(mx)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> mx[2, ]
[1] 2 5 8
> mx[, 3]
[1] 7 8 9
> is.vector(mx[, 3])
[1] TRUE

最後のとおりに、1行(列)だけ取り出したものはベクトルになる。これを行列のままにする場合はdropオプションにFALSEを与える。

> mx[2, , drop = FALSE]
[,1] [,2] [,3]
[1,] 2 5 8

複数行(列)取り出したい場合は、インデックスをベクトルで与える。以下は2行目と3行目のみを取り出した例。

> mx[c(2, 3), ]
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 3 6 9

2022年7月 8日 (金)

[R]行列から成分を取り出す

行ごと列ごとに角括弧(ブラケット)をつかってインデックス(1~)を指定する。インデックスは1から始まることに注意。

> mx <- matrix(1:6, 3, 2)
> print(mx)
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> mx[1, 2]
[1] 4
> mx[3, 2]
[1] 6
> mx[4, 2]
mx[4, 2] でエラー: 添え字が許される範囲外です

最後の例のように、行列の各長さより大きい値を指定すると、エラーが発生する。

2022年7月 7日 (木)

[R]文字列が指定の正規表現とマッチするか調べる

grep関数を使う。「ABC」、「abc」、「123」からなる文字列型ベクトルから「a」が含まれる要素があるか否か調べる。

> s <- c("ABC", "abc", "123")
> grep("[a]", s)
[1] 2

その要素自体を取り出す。

> grep("[a]", s, value = TRUE)
[1] "abc"

「A」か「a」が含まれている要素のインデックスを取り出す。

> grep("[Aa]", s)
[1] 1 2

「Z」が含まれている要素のインデックスを取りだしてみる。「Z」が含まれている要素はないので、長さが0の数値型ベクトルが返される。

> grep("[Z]", s)
integer(0)

2022年7月 5日 (火)

[R]CRANを指定する

パッケージをインストールする際に、install.packages関数を使用すると、どのCRANを使うかダイアログで選択する状態になるが、そうではなく、あらかじめCRANを指定しておく方法。以下はhttps://cran.ism.ac.jp/をパッケージのダウンロード元としてあらかじめ設定した例。

> options(repos = "https://cran.ism.ac.jp/")
> install.packages("rgl")
パッケージを ‘C:/Users/○○○/Documents/R/win-library/4.1’ 中にインストールします
(‘lib’ が指定されていないため)
URL 'https://cran.ism.ac.jp/bin/windows/contrib/4.1/rgl_0.109.2.zip' を試しています
(以下表示省略)

CRANではないURLを指定すると、当然パッケージはインストールされずにエラーメッセージが表示される。

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

2022年7月 4日 (月)

[Python]行列を作る

NumPyモジュールのarray関数を使う。以下、例。

>>> mx = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
>>> mx
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> mx[1, 2]
6
>>> mx[2, :]
array([7, 8, 9])
>>> mx[0, :] * 3
array([3, 6, 9])
>>> mx[:, 1] * 2
array([ 4, 10, 16])

要素を取り出す際にはインデックスを数値で与えることになるが、そのインデックスは0から始まる数値であることに注意。1行(列)目は0、2行(列)目は1、…ということ。その行(列)全てを指定する場合は「:」(コロン)を使う。

最後の2つの例のように、特定の行(列)だけまとめて計算することも可能。その場合の戻り値は当然行列になる。このあたりはRやOctaveの行列と同じ。

2022年7月 3日 (日)

[R]文字列の長さを調べる

nchar関数を使う。typeオプションに指定したいずれかの値で結果が変わる。なお、以下はWindows版で実行している。

bytes…バイト数
chars…文字の個数
width…画面表示される文字の幅(いわゆる半角は1、全角は2)

> s <- c("ABC", "あいう", "阿伊宇abc")
> nchar(s, type = "bytes")
[1] 3 6 9
> nchar(s, type = "chars")
[1] 3 3 6
> nchar(s, type = "width")
[1] 3 6 9

bytesとwidthは同じに見えるが、それはWindows環境下では日本語文字が1文字当たり2バイトだからであり、例えばutf-8(1文字3バイト)であれば以下のようになる。Windows環境下であるので一部は動作しない。

> s <- iconv("あ亜", from = "CP932", to = "utf-8")
> charToRaw(s)
[1] e3 81 82 e4 ba 9c
> nchar(s, type = "bytes")
[1] 6
> nchar(s, type = "chars")
nchar(s, type = "chars") でエラー: invalid multibyte string, element 1
> nchar(s, type = "width")
[1] NA

2022年7月 2日 (土)

[R]文字列を連結する

paste関数を使う。オプションを特に指定しないと空白(0x20)で引数に与えた文字列リテラルを連結する。単純に連結したいのであればsepオプションに""を指定する。

> s1 <- "ABC"
> s2 <- "あいう"
> s3 <- "阿伊宇abc"
> paste(s1, s2, s3)
[1] "ABC あいう 阿伊宇abc"
> paste(s1, s2, s3, sep = "")
[1] "ABCあいう阿伊宇abc"

2022年7月 1日 (金)

[R]現在の日時を取得する

日付だけであればSys.Date関数を、日時を得る場合はSys.time関数を使う。

> Sys.Date()
[1] "2022-06-30"
> Sys.time()
[1] "2022-06-30 23:06:14 JST"

Sys.Date関数の戻り値は日付型で、Sys.time関数の戻り値はPOSIXct型である。

> dt <- Sys.Date()
> class(dt)
[1] "Date"
> dt <- Sys.time()
> class(dt)
[1] "POSIXct" "POSIXt"

« 2022年6月 | トップページ | 2022年8月 »

無料ブログはココログ

■■

■■■