リンク

無料ブログはココログ

R (基本)

2020年7月 4日 (土)

[R]要素にNAかNaNが含まれていないか簡単に確認する

anyNA関数を使う。引数に指定したものに1つでもNAかNaNが含まれているとTRUEを返す。関数名からしてNAだけと思われがちだが、NaNがあってもTRUEを返す。引数に与えるものはベクトルでも行列でもかまわない。

> d <- c(1, 2, 3)
> anyNA(d)
[1] FALSE
> d <- c(1, 2, NA)
> anyNA(d)
[1] TRUE
> d <- c(1, 2, NaN)
> anyNA(d)
[1] TRUE
> mx <- matrix(c(1, 2, 3, 4), 2, 2)
> mx
[,1] [,2]
[1,] 1 3
[2,] 2 4
> anyNA(mx)
[1] FALSE
> mx <- matrix(c(1, 2, 3, NA), 2, 2)
> anyNA(mx)
[1] TRUE

無限大(Inf)は判定の対象にはならないことに注意。

> d <- c(1, 2, Inf)
> anyNA(d)
[1] FALSE

2020年6月 2日 (火)

[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[, c(1, 3)]
name sex
1 a M
2 b F
3 c M
> dtf[, 2:3]
age sex
1 30 M
2 10 F
3 20 M

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月 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年4月29日 (水)

[R]乱数を発生させる

runif関数を使う。第1引数に発生させたい乱数の個数を指定する。minオプション、maxオプションを指定すると、得られる乱数の下限値と上限値を指定できる。特に指定しなければ、それぞれ初期値の0と1となる。 

> d <- runif(1000)
> hist(d) # 1つ目の図
> d <- runif(1000, min = 5, max = 15)
> hist(d) # 2つ目の図

12

13

 

2020年4月 7日 (火)

[R]関数の最大値、最小値を求める

optimize関数を使う。引数には定義域(以下の例ではx)の範囲を指定する必要がある。

以下は、f(x) = -(x-5)^2 + 50の最大値を調べた例。図より、最大値は明らかに-50で、その時のxは5。maximumオプションをTRUEにすると、指定した関数が最大値を返す値を検索する。指定をしないと、最小値を検索する。

> x <- -10:10
> f <- function(x) -(x - 5) ^ 2 - 50
> plot(x, f(x))
> optimize(f, lower = -10, upper = 10, maximum = TRUE)
$maximum
[1] 5
$objective
[1] -50
> optimize(f, lower = -10, upper = 10)
$minimum
[1] -9.999926
$objective
[1] -274.9978

11

2020年3月31日 (火)

[R]固有値と固有ベクトルを求める

eigen関数を使う。求めたい行列を引数に与えると、2つの要素valuesとvectorsを持つリストを返し、それぞれが固有値と固有ベクトル。

> mx <- matrix(1:4, 2, 2, byrow = TRUE)
> mx
[,1] [,2]
[1,] 1 2
[2,] 3 4
> ei <- eigen(mx)
> ei
eigen() decomposition
$values
[1] 5.3722813 -0.3722813
$vectors
[,1] [,2]
[1,] -0.4159736 -0.8245648
[2,] -0.9093767 0.5657675
> ei$values
[1] 5.3722813 -0.3722813
> ei$values[1]
[1] 5.372281
> ei$vectors[2, ]
[1] -0.9093767 0.5657675

2020年3月30日 (月)

[R]ベクトルから最小の値(の要素番号)を抜き出す

min関数は引数にベクトルを指定すると、最小の値を返す。which.min関数は最初の値の要素番号を返す。最小の値が複数あった場合は、最初の値が対象となる。

> d <- c(3.0, 1.0, 2.0)
> min(d)
[1] 1
> which.min(d)
[1] 2
> d <- c(3.0, 1.0, 1.0)
> min(d)
[1] 1
> which.min(d)
[1] 2

2020年3月27日 (金)

[R]フルパスからファイル名のみ抜き出す

gsub関数を使う。

> s <- "C:/abc/def/ghi.jkl"
> gsub("^.+/", "", s)
[1] "ghi.jkl"

 

2020年3月25日 (水)

[R]download.file関数でダウンロードしたファイルが開けない

例えばエクセルのファイル(*.xlsx)をダウンロードする。以下は、財務省のホームページからxlsxファイルをダウンロードした例。

> s = "https://www.mof.go.jp/international_policy/reference/financial_flows_to_developing_countries/2017.xlsx"
> download.file(s, destfile = "sample.xlsx")
URL 'https://www.mof.go.jp/international_policy/reference/financial_flows_to_developing_countries/2017.xlsx' を試しています
Content type 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' length 27011 bytes (26 KB)
downloaded 26 KB

このダウンロードしてsample.xlsxと保存したファイルをエクセルで開くと「一部の内容に問題が見つかりました。」といわれて開けない。回復もできない。

xlsxファイルはバイナリファイルのため、modeオプションにwbを指定してダウンロードする。

> download.file(s, destfile = "sample.xlsx", mode = "wb")
URL 'https://www.mof.go.jp/international_policy/reference/financial_flows_to_developing_countries/2017.xlsx' を試しています
Content type 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' length 27011 bytes (26 KB)
downloaded 26 KB

このダウンロードしてsample.xlsxと保存したファイルは、エクセルで開けるはず。

より以前の記事一覧