Rとは
Rは統計計算とグラフ作成を得意とするプログラミング言語です。表データの読み込み、変換、集計、可視化、統計モデルまで一つの環境で行えます。操作をコードとして残せるため、同じ分析を再実行しやすいことも特徴です。
- データの出所と意味を確認する
- 行数・列・型・欠損値を調べる
- 必要な形へ整える
- 集計や可視化で特徴を確かめる
- 条件、結果、限界を記録する
実行環境を用意する
CRANからRを導入します。RStudioなどのIDEを使う場合も、先にR本体が必要です。コンソールは1行ずつ試す場所、スクリプトは後から再実行するコードを保存する場所として使い分けます。
R.version.string[1] "R version 4.x.x (...)"最初のコードを実行する
#から行末まではコメントです。代入には一般に<-を使います。コンソール出力の[1]は、表示行の最初の値がベクトルの何番目かを示します。
# 3日分の学習時間
hours <- c(1.5, 2, 0.5)
total <- sum(hours)
print(total)[1] 4値・型・変数
代表的な型は数値numeric、整数integer、文字列character、真偽値logicalです。整数を明示する場合は20LのようにLを付けます。
name <- "Mity"
age <- 20L
height <- 168.5
is_student <- TRUE
class(name); class(age); class(height); class(is_student)[1] "character"
[1] "integer"
[1] "numeric"
[1] "logical"文字列を数値へ変換するにはas.numeric()を使います。変換できない文字列は警告とともにNAになります。
ベクトルを扱う
ベクトルは同じ型の値を順番にまとめるRの基本データです。c()で作り、位置は1から数えます。演算は各要素へまとめて適用されます。
scores <- c(72, 85, 91, 68)
adjusted <- scores + 5
scores[1]
adjusted
scores[scores >= 80][1] 72
[1] 77 90 96 73
[1] 85 91length()で長さを確認しましょう。欠損値NA
NAは値が欠けていることを表します。NA == NAでは判定せず、is.na()を使います。集計時に無視するならna.rm = TRUEを明示します。
temperatures <- c(22.5, NA, 24.0, 23.5)
is.na(temperatures)
sum(is.na(temperatures))
mean(temperatures, na.rm = TRUE)[1] FALSE TRUE FALSE FALSE
[1] 1
[1] 23.33333データフレーム
データフレームは列ごとに名前と型を持つ表です。各行は同じ観測対象、各列は同じ項目になるよう作ります。
students <- data.frame(
name = c("Aki", "Mika", "Sora"),
score = c(78, 92, 85)
)
students[students$score >= 85, c("name", "score")] name score
2 Mika 92
3 Sora 85str()で構造、names()で列名、nrow()で行数を確認できます。詳しくはデータフレームとCSVで扱います。
条件分岐
ifの条件は長さ1の真偽値にします。ベクトルの各要素を分類する場合はifelse()が便利です。
score <- 82
if (score >= 80) {
result <- "合格(よくできました)"
} else if (score >= 60) {
result <- "合格"
} else {
result <- "再挑戦"
}
print(result)
ifelse(c(55, 72, 88) >= 60, "合格", "再挑戦")[1] "合格(よくできました)"
[1] "再挑戦" "合格" "合格"繰り返し
forは値を順番に取り出します。単純な集計にはベクトル向け関数を先に検討すると読みやすくなります。
names <- c("Aki", "Mika", "Sora")
for (i in seq_along(names)) {
cat(i, ": ", names[i], "\n", sep = "")
}1: Aki
2: Mika
3: Sora1:length(x)を避ける 空のベクトルでは意図しない列になります。添字が必要ならseq_along(x)を使います。関数を作る
関数は入力を引数で受け取り、結果を返す処理です。最後に評価した式が戻り値になります。
price_with_tax <- function(price, rate = 0.1) {
if (price < 0) stop("priceは0以上にしてください")
floor(price * (1 + rate))
}
price_with_tax(1500)
price_with_tax(1500, 0.08)[1] 1650
[1] 1620詳しくは関数・エラー・テストで学びます。
データを集計する
summary()で分布の概要を確認できます。グループ別集計にはaggregate()などを使います。
results <- data.frame(class = c("A", "A", "B", "B"), score = c(70, 90, 60, 80))
aggregate(score ~ class, data = results, FUN = mean) class score
1 A 80
2 B 70グラフを描く
組み込みデータmtcarsで車重と燃費の関係を描きます。
plot(mtcars$wt, mtcars$mpg,
xlab = "車重(1000ポンド)", ylab = "燃費(mpg)",
main = "車重と燃費", pch = 19, col = "steelblue")実行すると横軸が車重、縦軸が燃費の散布図が表示されます。詳しくはデータ可視化で学びます。
CSVを読み書きする
read.csv()で読み、write.csv()で保存できます。読み込んだ直後に構造と件数を確認します。
scores <- data.frame(name = c("Aki", "Mika"), score = c(82, 91))
write.csv(scores, "scores.csv", row.names = FALSE, fileEncoding = "UTF-8")
loaded <- read.csv("scores.csv", fileEncoding = "UTF-8")
str(loaded)getwd()で確認し、大切なファイルを上書きしないでください。パッケージを利用する
導入は通常一度だけ、読み込みはRを起動するたびに行います。
# コンソールで一度だけ
install.packages("ggplot2")
# スクリプト実行時
library(ggplot2)
packageVersion("ggplot2")練習問題
問題1:合格者を抽出する
c(55, 72, 88, 49)から60点以上だけを取り出してください。
scores <- c(55, 72, 88, 49)
scores[scores >= 60][1] 72 88問題2:欠損を除いて平均を求める
c(120, NA, 180, 150)の平均を求めてください。
mean(c(120, NA, 180, 150), na.rm = TRUE)[1] 150問題3:値引き関数を作る
価格と値引率を受け取り、値引き後の整数価格を返してください。
discount_price <- function(price, rate) floor(price * (1 - rate))
discount_price(2000, 0.2)[1] 1600