« 2020年4月 | トップページ | 2020年6月 »

2020年5月30日 (土)

[R]データフレームから特定の列を削除する

負の添え字によるインデックス付けを使う。

> name <- c("a", "b", "c")
> age <- c(30, 10, 20)
> sex <- c("M", "F", "M")
> dtf <- data.frame(name, age, sex)
> dtf
name age sex
1 a 30 M
2 b 10 F
3 c 20 M
> dtf[, -2]
name sex
1 a M
2 b F
3 c M
> dtf[, c(-2)]
name sex
1 a M
2 b F
3 c M
> dtf[, -1:-2]
[1] "M" "F" "M"

2020年5月28日 (木)

[Python]行列(ndarrayクラス)の行数と列数を得る

shape変数を使う。以下は、2行3列の行列から行数(2)と列数(3)を得る例。

>>> import numpy as np
>>> mx = np.array([[1, 2, 3], [4, 5, 6]])
>>> mx.shape
(2, 3)
>>> mx.shape[0]
2
>>> mx.shape[1]
3

2020年5月27日 (水)

[Python]エラーメッセージ「ValueError: math domain error」

関数の引数の値(変域)が正しくないため、関数を動作させることができていない。例えば、2を底とする32の対数(log232=5)を計算してみると、

>>> math.log(32, 2)
5.0

と対数が求まるが、対数の真数(上記の例では32)を負数(0未満の値)にして計算してみると、

>>> math.log(-1, 2)
Traceback (most recent call last):
File "", line 1, in
ValueError: math domain error

となる。対数の真数は正数でなければならないので、正常に動作させることができずに、例外が発生している。

2020年5月26日 (火)

[Python]2次元配列を作る(リストのリスト)

リストの要素をリストにすることで、行列のようなものを実現することができ、いわゆる2次元配列を作ることができる。

2行3列の2次元リストを作る。

>>> x = [[1, 2, 3], [4, 5, 6]]
>>> x
[[1, 2, 3], [4, 5, 6]]

要素を取り出すには、[1つ目のインデックス][2つ目のインデックス]とする。インデックスは0から始まることに注意。

>>> x[0][0]
1
>>> x[1][2]
6

2020年5月24日 (日)

[Python]転置行列を作る

NumPyライブラリのndarrayクラスを使う場合は.Tを使う。以下は、2行3列の行列を転置させた例(つまり3行2列の行列を作る)。

>>> import numpy as np
>>> mx1 = np.array([[1, 2, 3], [4, 5, 6]])
>>> mx1[1, 2]
6
>>> np.array(mx1).T
array([[1, 4],
[2, 5],
[3, 6]])
>>> mx2 = np.array(mx1).T
>>> mx2
array([[1, 4],
[2, 5],
[3, 6]])
>>> mx2[2, 1]
6

2020年5月21日 (木)

[Python]行列を作る

NumPyライブラリのndarrayクラスを使う。以下は、2行3列の行列を作る例。

>>> import numpy as np
>>> np.array([[1, 2, 3], [4, 5, 6]])
array([[1, 2, 3],
[4, 5, 6]])

行列から要素を取り出すには、[行番号,列番号]と指定する。ただし、行番号も列番号も0から始まるので注意。上の例で、2行3列目の要素である6を取り出すには、以下のようにする。

>>> mx = np.array([[1, 2, 3], [4, 5, 6]])
>>> mx[1, 2]
6

2020年5月19日 (火)

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

整数の場合はint関数、小数の場合はfloat関数を使用する。

>>> int('1')
1
>>> int('1') + int(' 20 ')
21
>>> int('0.1')
Traceback (most recent call last):
File "", line 1, in
ValueError: invalid literal for int() with base 10: '0.1'
>>> float('0.1')
0.1
>>> float('0.1') + float(' 1.5 ')
1.6

int関数もfloat関数も、引数に指定した文字列に空白が含まれていてもかまわない。int関数に小数を指定すると、エラーが発生する。

2020年5月16日 (土)

[R]Silverman (1985)によるオートバイ衝突事故の実験データ

MASSパッケージにデータフレーム形式で含まれている。

> install.packages("MASS")
> library(MASS)
> head(mcycle)
times accel
1 2.4 0.0
2 2.6 -1.3
3 3.2 -2.7
4 3.6 0.0
5 4.0 -2.7
6 6.2 -2.7
> tail(mcycle)
times accel
128 52.0 10.7
129 53.2 -14.7
130 55.0 -2.7
131 55.0 10.7
132 55.4 -2.7
133 57.6 10.7
> nrow(mcycle)
[1] 133
> plot(mcycle$times, mcycle$accel)

Silverman1985

引用元の論文は以下のとおり。

Silverman, B.W. (1985), Some Aspects of the Spline Smoothing Approach to Non‐Parametric Regression Curve Fitting. Journal of the Royal Statistical Society: Series B (Methodological), 47: 1-21.
doi:10.1111/j.2517-6161.1985.tb01327.x

2020年5月14日 (木)

[R]行列のトレース(固有和)を求める

Rには行列のトレースを直接計算する関数は標準では搭載されていない。

sum関数とdiag関数を組み合わせると簡単に求めることができる。

> d <- 1:9
> mx <- matrix(d, 3, 3)
> mx
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> sum(diag(mx))
[1] 15
> d <- 1:16
> mx <- matrix(d, 4, 4)
> mx
[,1] [,2] [,3] [,4]
[1,] 1 5 9 13
[2,] 2 6 10 14
[3,] 3 7 11 15
[4,] 4 8 12 16
> sum(diag(mx))
[1] 34

2020年5月 9日 (土)

[R]関数を使用時にエラーが発生したか否かの判定をする

try関数を使用する。try関数の第1引数に実行するコマンドを指定してtry関数を実行すると、エラーが発生した場合には、特殊な戻り値が戻される。

以下は、正則行列ではない行列の逆行列をsolve関数で求めようとした場合の例。

> mx1 <- matrix(1:9, 3, 3)
> mx1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> mx2 <- solve(mx1)
solve.default(mx1) でエラー:
Lapack routine dgesv: システムは正確に特異です: U[3,3] = 0
> r <- try(mx2 <- solve(mx1))
Error in solve.default(mx1) :
Lapack routine dgesv: システムは正確に特異です: U[3,3] = 0
> r <- try(mx2 <- solve(mx1), TRUE)
> mx2
エラー: オブジェクト 'mx2' がありません
> class(r)
[1] "try-error"
> class(r) == "try-error"
[1] TRUE

逆行列が求められなかったため、mx2には何も代入されておらず、try関数の戻り値はtry-errorクラスになる。このtry関数の戻り値を文字列で判定することで、エラーが発生したか否かの判定が行える。

以下はエラーが発生しない例。try関数の戻り値は、指定をしたコマンドの戻り値が代入される。

> mx1 <- matrix(1:4, 2, 2)
> solve(mx1)
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> r <- try(mx2 <- solve(mx1), TRUE)
> mx2
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> r
[,1] [,2]
[1,] -2 1.5
[2,] 1 -0.5
> class(r)
[1] "matrix"

2020年5月 3日 (日)

[R]同じ乱数を発生させる

同じ乱数を発生させるにはset.seed関数を使う。引数の値(種という)に応じて乱数の発生を設定するため、同じ値を設定すれば、同じ乱数が得られるようになる。

> runif(3)
[1] 0.3814675 0.2523344 0.4245695
> runif(3)
[1] 0.1408280 0.5990673 0.1032862
> runif(3)
[1] 0.1752793 0.1997167 0.5213036
> set.seed(3)
> runif(3)
[1] 0.1680415 0.8075164 0.3849424
> set.seed(3)
> runif(3)
[1] 0.1680415 0.8075164 0.3849424
> set.seed(4)
> runif(3)
[1] 0.585800305 0.008945796 0.293739612

R起動時には、自動で任意の種が設定される。

この関数を使用すると種に基づいて乱数が発生されるようになるが、この種は、Rを再起動しても同じ種を与えれば同じ乱数が発生される。機種が異なっても(WindowsとLinuxなど)、種さえ同じであれば全く同じ乱数が発生される。

« 2020年4月 | トップページ | 2020年6月 »

無料ブログはココログ

■■

■■■