[R]リストの要素を逆順に並び替える
rev関数を使う。
> n <- 1:3
> s <- c("A", "B", "C")
> d <- c(2.4, 6.8)
> lst <- list(n, s, d)
> print(lst)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 2.4 6.8
> print(rev(lst))
[[1]]
[1] 2.4 6.8
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 1 2 3
« 2022年7月 | トップページ | 2022年9月 »
rev関数を使う。
> n <- 1:3
> s <- c("A", "B", "C")
> d <- c(2.4, 6.8)
> lst <- list(n, s, d)
> print(lst)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 2.4 6.8
> print(rev(lst))
[[1]]
[1] 2.4 6.8
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 1 2 3
rev関数を使う。
> n <- c(1:3, 5:4)
> s <- c("A", "B", "D", "C")
> print(n)
[1] 1 2 3 5 4
> print(s)
[1] "A" "B" "D" "C"
> print(rev(n))
[1] 4 5 3 2 1
> print(rev(s))
[1] "C" "D" "B" "A"
Rには条件演算子(三項演算子)はなく、ifelse関数で代用することができる。
ifelse(v1, v2, v3)
v1は論理型ベクトルで、v1が真(TRUE)の場合はv2が、偽(FALSE)の場合はv3が戻り値になる。
> n <- 3
> n <- c(1, 2, 3)
> ifelse(n >= 2, c("A", "B", "C"), c("a", "b", "c"))
[1] "a" "B" "C"
getwd関数を使う。
> getwd()
[1] "C:/Users/○○/Documents"
> setwd("C:/Users/○○/Pictures/")
> getwd()
[1] "C:/Users/○○/Pictures"
> setwd("C:/Users/○○/Picture/")
setwd("C:/Users/○○/Picture/") でエラー:
作業ディレクトリを変更できません
最後の例のとおり、存在しないディレクトリを指定するとエラーが発生する。
lubridateパッケージのdays_in_month関数を使う。例えば、2000年2月の日数(この年は閏年のため29)、2022年8月の日数(31)を求める。
> library(lubridate)
> dt <- as.Date(c("2000-02-01", "2022-08-01"))
> days_in_month(dt)
Feb Aug
29 31
> typeof(days_in_month(dt))
[1] "integer"
HmiscパッケージのmonthDays関数も使える。
> library(Hmisc)
> dt <- as.Date(c("2000-02-01", "2022-08-01"))
> monthDays(dt)
[1] 29 31
> typeof(monthDays(dt))
[1] "integer"
getwd関数を使う。インストール直後のスタートメニューからRを起動した状態で実行してみる。
> getwd()
[1] "C:/Users/○○/Documents"
○○にはアカウント名が入る。
これはスタートメニューからRを起動するとそのようになっただけであり、例えば既存の.RDataファイルをダブルクリックしてRを起動すれば、その.RDataを置いてあるディレクトリをカレントディレクトリとしてRは起動することになる。
ファイル「Rconsole」をテキストエディターで修正する。
当該ファイルはインストール直後はC:\Program Files\R\R-4.2.1\etc(バージョン4.2.1の場合)だけに置かれている。このフォルダーに置かれたRconsoleは、そのサーバーを利用する全てのアカウント向けの設定ファイルのため、このファイルを修正することは推奨しない。
このC:\Program Files\R\R-4.2.1\etc\Rconsoleをサインインしているアカウント専用のドキュメントフォルダーにコピーする。
C:\Users\○○\Documents
※○○はアカウント名
このフォルダーにファイル「Rconsole」がある場合は、こちらの内容が優先的に採用されるため、そのアカウントで設定したい内容(フォントウィンドウの位置など)があれば、メニュー「編集」→「GUIプリファレンス」で「Rgui設定エディター」ダイアログを表示させ、設定をした後に下部の「Save...」ボタンをクリックし、上記フォルダーを選択してそこにRconsoleを保存する。
ファイル「Rconsole」はテキストファイルのため、後でそのファイルをテキストエディターで直接修正しても、修正は反映される(Rを要再起動)。
stringiパッケージのstri_trans_general関数を使う。以下、変換例。
> library(stringi)
> s <- c("あい", "宇", "イヌ", "ネコ", "AB@", "CD{", "12", "34")
> stri_trans_general(s, "Halfwidth-Fullwidth")
[1] "あい" "宇" "イヌ" "ネコ" "AB@" "CD{" "12" "34"
> stri_trans_general(s, "Fullwidth-Halfwidth")
[1] "あい" "宇" "イヌ" "ネコ" "AB@" "CD{" "12" "34"
全角→半角変換には"Fullwidth-Halfwidth"を、半角→全角変換には"Halfwidth-Fullwidth"を指定する。英数字、カタカナ、記号など変換できるものはすべて変換するので注意。該当しない文字(ひらがな、漢字)は変換されない。
ISOdate関数を使う。戻り値はPOSIXct。タイムゾーンを指定しないとGMTになってしまうことに注意。タイムゾーンの情報が不要であれば、戻り値をas.Date関数に通すと通常の日付型になる。
> ISOdate(2000, 1, 24)
[1] "2000-01-24 12:00:00 GMT"
> ISOdate(2000, 1, 24, tz = "Japan")
[1] "2000-01-24 12:00:00 JST"
> class((ISOdate(2000, 1, 24)))
[1] "POSIXct" "POSIXt"
> as.Date((ISOdate(2000, 1, 24)))
[1] "2000-01-24"
cos関数(余弦関数)、sin関数(正弦関数)、tan関数(正接関数)を使う。角θの値が、次の各値の時、cosθ、sinθ、tanθを求めてみる。
θ=0, π/2, π, 2π
> theta <- c(0, pi / 2, pi, 2 * pi)
> cos(theta)
[1] 1.000000e+00 6.123032e-17 -1.000000e+00 1.000000e+00
> sin(theta)
[1] 0.000000e+00 1.000000e+00 1.224606e-16 -2.449213e-16
> tan(theta)
[1] 0.000000e+00 1.633124e+16 -1.224647e-16 -2.449294e-16
~-17や~-16は計算上限りなく小さい値が求まった(≒0.0)ということであり、実際にそのような値が精度良く求まったということではない。~+16(≒∞)も同様である。
runif関数を使う。第一引数には発生させる乱数の数を指定する。デフォルトでは、0~1の範囲の小数を返す。
> runif(5)
[1] 0.67853053 0.11993910 0.88077171 0.27966928 0.07728223
> d <- runif(1.e5)
> hist(d)
発生させる乱数の最小値と最大値は、それぞれminオプション、maxオプションで指定することができる。
> d <- runif(1000, min = 100, max = 300)
> hist(d)
choose関数を使う。n個からr個とった組合せの数を求める。5C2(=10)、7C3(=35)、10C2(=45)を求めてみる。
> choose(5, 2)
[1] 10
> choose(7, 3)
[1] 35
> choose(10, 2)
[1] 45
roudn関数を使う。第一引数には対象となる数を、第二引数には丸める判定を行う小数点以下第何位の数かを指定する。
> sprintf("%.5f", round(c(1.23, 1.24, 1.25, 2.23, 2.24, 2.25), 1))
[1] "1.20000" "1.20000" "1.20000" "2.20000" "2.20000" "2.20000"
length関数を使う。
> n <- 1:10
> s <- c("A", "B", "C")
> lst <- list(n, s)
> print(lst)
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] "A" "B" "C"
> length(lst)
[1] 2
round関数を使う。JIS規格 (JIS Z 8401) による偶数丸めであることに注意。
> sprintf("%.5f", round(c(1.3, 1.4, 1.5, 2.3, 2.4, 2.5)))
[1] "1.00000" "1.00000" "2.00000" "2.00000" "2.00000" "2.00000"
ceiling関数を使う。厳密には、その数より大きい最小の整数を返すことに注意。
> sprintf("%.5f", ceiling(c(1.23, -1.23, 0.1, -0.1)))
[1] "2.00000" "-1.00000" "1.00000" "-0.00000"
trunc関数を使う。
> sprintf("%.5f", trunc(c(1.23, -1.23, 0.1, -0.1)))
[1] "1.00000" "-1.00000" "0.00000" "-0.00000"
似たような機能を持つfloorという関数もある。こちらは、その数より小さい最大の整数を返す。
> sprintf("%.5f", floor(c(1.23, -1.23, 0.1, -0.1)))
[1] "1.00000" "-2.00000" "0.00000" "-1.00000"
log関数を使う。aを底とするNの対数の求め方は以下のとおり。
log(N, a)
log33(=1)、log51(=0)、log3243(=5)の値をそれぞれ求める。
> log(3, 3)
[1] 1
> log(1, 5)
[1] 0
> log(243, 3)
[1] 5
底は省略することができる。その場合はeを底とする自然対数が求まる。
> log(2)
[1] 0.6931472
> log(2, exp(1))
[1] 0.6931472
常用対数(10を底とする対数)を求めるlog10関数、2を底とする対数を求めるlog2関数もある。
> log10(100)
[1] 2
> log(100, 10)
[1] 2
> log2(20)
[1] 4.321928
> log(20, 2)
[1] 4.321928
数値リテラルに0xを付けて計算するかas.hexmode関数を使う。0xを付けて計算をすると戻り値は10進数かつ数値型。as.hexmode関数の戻り値を含めると、戻り値は16進数かつ文字列になることに注意。
> 9 + 2
[1] 11
> 0x9 + 0x2
[1] 11
> 0x9 + 2
[1] 11
> 0xb
[1] 11
> as.hexmode("9") + as.hexmode("2")
[1] "b"
> as.hexmode("9") + 2
[1] "b"
strtoi関数を使う。第一引数に変換したいn進数を文字列で、第二引数に変換したいn進数のnの値を整数で与える。
> strtoi(c("1", "10", "100"), 2L)
[1] 1 2 4
> strtoi(c("1", "10", "100"), 10L)
[1] 1 10 100
> strtoi(c("1", "10", "100"), 16L)
[1] 1 16 256
> strtoi(c("f", "ff", "fff"), 10L)
[1] NA NA NA
> strtoi(c("f", "ff", "fff"), 16L)
[1] 15 255 4095
> mode(strtoi(c("1", "10", "100"), 16L))
[1] "numeric"
> class(strtoi(c("1", "10", "100"), 16L))
[1] "integer"
変換できない文字列の場合はNAが返される。戻り値は数値型(整数)である。
append関数を使う。デフォルトでは最後に追加する。特定の要素の後に追加したい場合は、afterオプションに挿入前のインデックスを指定する。
> n <- 1:3
> s <- c("A", "B", "C")
> d <- c(1.1, 2.2, 3.3)
> lst0 <- list(n, s)
> print(lst0)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
> lst1 <- append(lst0, list(d))
> print(lst1)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 1.1 2.2 3.3
> lst2 <- append(lst0, list(d), after = 1)
> print(lst2)
[[1]]
[1] 1 2 3
[[2]]
[1] 1.1 2.2 3.3
[[3]]
[1] "A" "B" "C"
matrix関数を使う。行列の要素を格納したベクトルを第一引数に与えて、nrowオプションで行数を、ncolオプションに列数を与える。デフォルトでは列番号が小さい列から順に要素が格納される。これを行番号が小さい行から順に格納するにはbyrowオプションにTRUEを指定する。
> d <- 1:12
> mx <- matrix(d, 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
> mx <- matrix(d, ncol = 4)
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> mx <- matrix(d, ncol = 5)
警告メッセージ:
matrix(d, ncol = 5) で:
データ長 [12] が列数 [5] を整数で割った、もしくは掛けた値ではありません
> mx <- matrix(d, ncol = 4, byrow = TRUE)
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 5 6 7 8
[3,] 9 10 11 12
> mx <- matrix(1:4, nrow = 2, ncol = 4, byrow = TRUE)
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 1 2 3 4
> mx <- matrix(0., 2, 5)
> print(mx)
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
例のとおりに、何も指定しなければ第二引数が行列、第三引数が列数になる。ベクトルの要素の数で行列どちらかが決まればもう片方も決まるため、行または列の省略は可能。ただし、ベクトルの要素の数に応じた正しい値でなければならない。指定した行数×列数の要素数に対してベクトルの要素数が足らないときは、そのベクトルの要素数が行数×列数の約数であれば、自動的に繰り返し使われる。
[ ]演算子とorder関数を組み合わせて使う。2つ以上の値で並び替える場合は、order関数にその並び替える順番に列を指定する。order関数による並び替えはデフォルトで昇順に並び替えられるが、これを降順にするのであればorder関数のdecreasingオプションにTRUEを与える。
> n <- c(3, 3, 1, 2)
> s1 <- c("ABC", "123", "123", "abc")
> s2 <- c("え", "う", "い", "あ")
> dtf <- data.frame(n, s1, s2)
> print(dtf)
n s1 s2
1 3 ABC え
2 3 123 う
3 1 123 い
4 2 abc あ
> print(dtf[order(dtf$n), ])
n s1 s2
3 1 123 い
4 2 abc あ
1 3 ABC え
2 3 123 う
> print(dtf[order(dtf$n, dtf$s2), ])
n s1 s2
3 1 123 い
4 2 abc あ
2 3 123 う
1 3 ABC え
> print(dtf[order(dtf$n, decreasing = TRUE), ])
n s1 s2
1 3 ABC え
2 3 123 う
4 2 abc あ
3 1 123 い
data.frame関数を使う。
> no <- 1:3
> n <- 1:3
> s <- c("田中", "山本", "林")
> dt <- as.Date(c("2001-01-01", "2002-08-31", "1999-12-29"))
> dtf <- data.frame(n, s, dt)
> print(dtf)
n s dt
1 1 田中 2001-01-01
2 2 山本 2002-08-31
3 3 林 1999-12-29