R入門
演算子と制御構文
最終更新:
r-intro
目次
剰余を求める
%%演算子を使う。
> n <- -5:5
> print(n)
[1] -5 -4 -3 -2 -1 0 1 2 3 4 5
> n %% 3
[1] 1 2 0 1 2 0 1 2 0 1 2
> d <- seq(-3, 3, 0.5)
> print(d)
[1] -3.0 -2.5 -2.0 -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0
> d %% 2
[1] 1.0 1.5 0.0 0.5 1.0 1.5 0.0 0.5 1.0 1.5 0.0 0.5 1.0
条件演算子(三項演算子)を使う
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"
パイプを使う
dplyrパッケージの%>%演算子を使う。以下はデータAirPassengersの先頭から10個のレコードを表示させるために、%>%演算子によるパイプラインを使用して抽出した例。
> head(AirPassengers)
[1] 112 118 132 129 121 135
> head(AirPassengers, 10)
[1] 112 118 132 129 121 135 148 148 136 119
> AirPassengers %>% head()
AirPassengers %>% head() でエラー:
関数 "%>%" を見つけることができませんでした
> library(dplyr)
> AirPassengers %>% head()
[1] 112 118 132 129 121 135
> AirPassengers %>% head(10)
[1] 112 118 132 129 121 135 148 148 136 119
%>%演算子は、次の受け取った出力を次の関数の第一引数に与える。受ける関数は、第一引数を省略して記述すればよい。
> dtf <- data.frame(no = 1:12, month = month.abb)
> head(dtf)
no month
1 1 Jan
2 2 Feb
3 3 Mar
4 4 Apr
5 5 May
6 6 Jun
> subset(dtf, no == 3 | no == 4)
no month
3 3 Mar
4 4 Apr
> dtf %>% subset(no == 3 | no == 4)
no month
3 3 Mar
4 4 Apr
パイプを使う
バージョン4.0.5までは標準で搭載されておらず、magrittrパッケージを導入すれば%>%演算子でパイプを実現することができた。この次のバージョン(4.1.0)からはパイプの機能が標準搭載され、|>演算子を使うことでパイプを実現することができる。
> R.Version()$version.string
[1] "R version 4.0.5 (2021-03-31)"
> s <- c("鈴木みのり", "野口瑠璃子", "和多田美咲")
> s |> sort()
エラー: 予想外の '>' です in "s |>"
> library(magrittr)
> s %>% sort()
[1] "野口瑠璃子" "鈴木みのり" "和多田美咲"
バージョン4.1.0では以下のとおり。
> R.Version()$version.string
[1] "R version 4.1.0 (2021-05-18)"
> s <- c("鈴木みのり", "野口瑠璃子", "和多田美咲")
> s |> sort()
[1] "野口瑠璃子" "鈴木みのり" "和多田美咲"
条件式で条件を設定してエラーを出す
stopifnot関数を使う。引数に与えた一つ以上の式が一つでもFALSEの場合は、エラーを出す。スクリプトでうまく使えばデバッグに利用できる。
> no <- 58
> umamusume <- "メイショウドトウ"
> cv <- "和多田美咲"
> stopifnot(no == 58)
> stopifnot(no == 58, umamusume == "メイショウドトウ")
> stopifnot(no == 58, umamusume == "メイショウドトウ", cv == "石見舞菜香")
エラー: cv == "石見舞菜香" は TRUE ではありません
> for (i in 1:5) {stopifnot(i < 3); cat(i, "\n")}
1
2
エラー: i < 3 は TRUE ではありません