R (基本)

2019年7月 4日 (木)

[R]ベクトルの要素を逆順に並び替える

rev関数を使う。

> s <- c("U", "N", "I", "X")
> s
[1] "U" "N" "I" "X"
> rev(s)
[1] "X" "I" "N" "U"
> n <- c(3, 1, 4, 1)
> n
[1] 3 1 4 1
> rev(n)
[1] 1 4 1 3

2019年6月17日 (月)

[R]小数を任意の桁数表示の文字列に変換する

sprintf関数を使う。書式の指定に f を使う。

> cat(sprintf("%.4f %.4f\n", 12.34, 5.678))
12.3400 5.6780
> cat(sprintf("%9.3f %9.5f\n", 12.34, 5.678))
12.340 5.67800

 

2019年6月 3日 (月)

[R]データフレーム内のデータを特定の列の値でソートする

order関数を組み合わせて使うことで、ソートされたデータフレームを得ることができる。

以下は、一列目の値(A~Cのいずれかからなる文字)と二列目の値(1~4のいずれかからなる数値)でソートした例。

> a <- c("C", "B", "B", "A")
> b <- c(1, 2, 1, 4)
> dtf <- data.frame(a, b)
> dtf
a b
1 C 1
2 B 2
3 B 1
4 A 4

まずは、二列目の値でソートする。order関数は初期状態では昇順でインデックスを返すため、そのとおりに並び替えられる。同じ値は、先に登場した順となる。

> dtf[order(dtf$b), ]
a b
1 C 1
3 B 1
2 B 2
4 A 4

一列目の値でソートし、次に二列目の値でソートする。直前の例と異なるのは、最初のソート(一列目のソート)はそのままに、その際に最初のソートの同じ値の中でさらにソートをしている。

> dtf[order(dtf$a, dtf$b), ]
a b
4 A 4
3 B 1
2 B 2
1 C 1

order関数は、引数に負数を与えるとソートを逆向きに行う。数値の場合は降順となる。

> dtf[order(dtf$a, -dtf$b), ]
a b
4 A 4
2 B 2
3 B 1
1 C 1

2019年4月25日 (木)

[R]文字の文字コードを簡単に調べる

charToRaw関数は引数に与えた文字列をロウ型で返すため、これを利用すると、そのRを実行している環境での文字コードを簡単に調べることができる。以下は、文字列「あい亜井」のそれぞれの文字の文字コードを調べた例。なお、これら文字の文字コード(左から、文字、その文字のシフトJISコード、その文字のutf-8コード)は以下のとおり(0xは16進数であることを示す接頭語)。

あ 0x82A0 0xE38182
い 0x82A2 0xE38184
亜 0x889F 0xE4BA9C
井 0x88E4 0xE4BA95

Windows 7上のR(文字コードはシフトJIS)で実行すると、以下のようにシフトJISコードがバイト単位で返される。

> charToRaw("あい亜井")
[1] 82 a0 82 a2 88 9f 88 e4

任意の文字の任意の文字コードを調べるには、iconv関数を使う。デフォルトでは戻り値は文字列のため、文字コードの値を知りたいのであれば、toRawオプションをTRUEにすることでロウ型で返すため、これをTRUEにする。Windows 7上のR(文字コードはシフトJIS)で実行すると、以下のようになる。

> iconv("あい亜井", to = "sjis", toRaw = TRUE)
[[1]]
[1] 82 a0 82 a2 88 9f 88 e4

> iconv("あい亜井", to = "utf-8", toRaw = TRUE)
[[1]]
[1] e3 81 82 e3 81 84 e4 ba 9c e4 ba 95

[R]ロウ型(raw type)について

Rにおけるロウ型(raw type)とは、他のプログラミング言語でいうところの文字型のこと。データを保持する構造(型)の一つで、バイト単位で保持する。

ロウ型ベクトルを作成するには、raw関数を使用する。引数に0を指定すると、空(長さが0)のロウ型ベクトルを作ることができる。

> raw()
raw(0)
> raw(3)
[1] 00 00 00
> length(raw(3))
[1] 3

ロウ型か否かの判定には、is.raw関数を使用する。

> is.raw(0)
[1] FALSE
> is.raw("A")
[1] FALSE
> is.raw(raw(3))
[1] TRUE

2019年4月17日 (水)

[R]ファイル、フォルダー(ディレクトリ)の存在を確認する

file.exists関数を使う。Rではフォルダー(ディレクトリ)の区切りを示す記号に「¥」(円マーク)と「/」(スラッシュ)の両方を使うことができる。

存在を確認するファイルかフォルダーのパスを文字列で、引数に指定する。存在すればTRUE、無ければFALSEを返す。

> file.exists("C:/Windows")
[1] TRUE
> file.exists("C:/Windows/explorer.exe")
[1] TRUE
> file.exists("C:/Window")
[1] FALSE
> file.exists("C:/Windows/explorerr.exe")
[1] FALSE

なお、file.exists関数だけでは、ファイルとフォルダーの違いは判別できない。ファイルとフォルダーを判別するには、file.info関数を使う。

file.info関数は、引数に与えられたファイルかフォルダーについて、その様々な情報をリスト形式で返す。

> file.info("C:/Windows")
size isdir mode mtime ctime atime exe
C:/Windows 0 TRUE (以下、表示省略)
> mode(file.info("C:/Windows"))
[1] "list"

ファイルなのかフォルダーなのかについては、要素isdirを見る。ファイルであればFALSE、フォルダーであればTRUEを返す。

> file.info("C:/Windows")$isdir
[1] TRUE
> file.info("C:/Windows/explorer.exe")$isdir
[1] FALSE

file.info関数に存在しないファイルやフォルダーを指定した場合は、NAが返される。

> file.info("C:/Windows/explorerr.exe")$isdir
[1] NA

2019年3月27日 (水)

[R]同点タイ有り順位をつける

rank関数を使う。ties.methodオプションに「"min"」を指定すること。以下、例。

> d <- c(90, 80, 80, 70, 50)
> rank(d, ties.method = "min")
[1] 5 3 3 2 1

rank関数は、昇順で順位をつけるため、これを数値が大きい順番で順位をつけるのであれば、順位の基準とする値が格納されているベクトルの正負を逆にすればよい。

> rank(-d, ties.method = "min")
[1] 1 2 2 4 5
> n <- rank(-d, ties.method = "min")
> data.frame(n, d)
n d
1 1 90
2 2 80
3 2 80
4 4 70
5 5 50

2019年3月 4日 (月)

[R]コンソール画面の表示を更新する

コンソール画面でsource関数でスクリプトを実行したとき、cat関数などで出力した結果はすぐには表示されない。例えば、以下の4行の内容をスクリプトファイルwait1.Rに保存して、実行する。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
}


> source("wait1.R")
1
2
3
4
5

実行後、数秒~十数秒間何も表示されずに待たされた後に、1から5までがまとめて表示されるはず。Rのコンソール画面では、cat関数などによるコンソールへの出力はまとめて出力されてしまう。これを、逐次表示されるようにするには、flush.console関数を使う。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
    flush.console()
}

以下の5行の内容をスクリプトファイルwait2.Rに保存して、実行する。

for (i in 1:5) {
    cat(sprintf("%d\n", i))
    mx <- solve(matrix(rnorm(1.e6), nrow = 1.e3))
    flush.console()
}


> source("wait2.R")
1
2
3
4
5

今度は、1から5までが順次表示されるはず。flush.console関数の場所で、コンソール画面の表示が更新されている。これは、例えば処理に時間のかかるスクリプトを作成し、その実行の経過をコンソール画面への出力で確認するときなど使えるテクニック。

VBA(Visual Basic for Applications)では、画面表示などを更新(画面表示のバッファを解放)するためにDoEvents関数を使用するテクニックがあるが、それと似たような動作と思えばよい(ただし、こちらはオペレーティングシステムに制御を一瞬渡すのであって、更新されるのは画面表示に限らないことに注意)。

なお、バッチ処理では、このようなコンソールへの出力はまとめて行われないことに注意。

2018年12月12日 (水)

[R]文字列の文字コードを任意の文字コードに変換する

iconv関数は、引数に指定した文字列の文字コードを任意の文字コードに変換する。fromオプションに変換前の文字コードを、toオプションに変換後の文字コードを指定する。

> charToRaw("あ亜")
[1] 82 a0 88 9f
> charToRaw(iconv("あ亜", from = "CP932", to = "eucjp"))
[1] a4 a2 b0 a1
> charToRaw(iconv("あ亜", from = "CP932", to = "utf-8"))
[1] e3 81 82 e4 ba 9c
> charToRaw(iconv("あ亜", from = "CP932", to = "utf-16"))
[1] fe ff 30 42 4e 9c

上記はWindowsのRで文字コードで確認をした例。
WindowsのRの日本語コードは、初期状態ではシフトJIS(正確にはCP932)であるため、fromは「CP932」と指定している。「あ」はシフトJISでは0x82a0、EUCでは0xa4a2、UTF-8では0xe38182、UTF-16では0x3042。「亜」はシフトJISでは0x889f、EUCでは0xb0a1、UTF-8では0xe4ba9c、UTF-16で0x4e9cである。toオプションに「utf-16」を指定すると、ビッグエディアンのBOM(バイトオーダーマーク)である「fe ff」が先頭に付いているのがわかる。

2018年12月 7日 (金)

[R]iconv関数で扱えるエンコーディング(日本語コード)を確認する。

iconvlist関数は、iconv関数で使用することができるエンコーディングを返す。

> iconvlist()
(表示省略)
[277] "SHIFFT_JIS"              "SHIFFT_JIS-MS"         
[279] "shift-jis"               "shift_jis"             
[281] "SJIS"                    "SJIS-MS"               
(表示省略)

上記はWindows版で使用した例。これに表示されたエンコーディングは使用することができる。

より以前の記事一覧