勉強会用に作成したものの改訂版。対象はRを少し触ったことがあるくらいの人達。
Rの授業というと教える人が実演する→各自が真似する、という流れが多い気がする。でもそれだとあまり身につかない。
まずは訳が分からなくても触ってみる→そのあと説明を聞いて納得する、という流れで慣れることができ、理解につながると思う。
2020年3月4日追記:
コードをThe tidyverse style guideに沿うよう書き直しました。
#問題
各セクションを自分で調べながらとりあえずやってみる→答えを見て操作を覚える、という風に使うことを想定しています。
※1 tidyverseでやれば楽な操作もありますが、環境の互換性などを考慮して、答えはbaseの操作によるもののみとしています。
※2 教える対象が調査データを扱う人たちなので、とりあえず行列&配列はなしで、データフレームの操作に重点を置いています。
###☆参考になるページ
R-Tips http://cse.naro.affrc.go.jp/takezawa/r-tips/r.html
基礎的なことはここで学べる
Rstudioのチートシートbase版 https://github.com/rstudio/cheatsheets/blob/master/base-r.pdf
英文だが、baseの操作が1枚にまとまっていて便利
##事前準備
Rを起動し、特定のフォルダを作業ディレクトリに指定しなさい
##データ操作の初歩
-
$ 1+1,~~ 1-1,~~ 1\times1,~~ 1\div1 $をRで計算しなさい
-
次の値をRで計算しなさい
$$ \frac{2.15^2 + 2.33}{12-10.3} $$ -
次の数値、文字列のclassを確認しなさい
3.141592 "Hello, World!" -
1~10までの整数が順番に入ったベクトルを作りなさい
-
問4のベクトルのクラスを確認しなさい
-
R上で次のベクトル操作を行いなさい
問4のベクトルの各値に2をかけたベクトルを作成 -
関数を使って、1~100までの整数が順番に入ったベクトルを作りなさい
-
関数を使って、1〜100までの整数の和と平均を求めなさい
-
関数を使って、1が100個入ったベクトルを作りなさい
-
問2の答えと問7の答えをそれぞれオブジェクト「A」と「B」に格納し、足し合わせなさい
-
問10の答えをオブジェクト「C」に格納しなさい
-
関数を使って「C」の要素数を求めなさい
-
「C」の37番目の要素を抜き出しなさい
-
「C」の37番目の要素を−999に置換しなさい
-
「C」の76番目の要素を削除しなさい
-
「C」の要素の中で、50以上のものを求めなさい
-
「A」と「B」と「C」を格納したリスト「list1」を作成しなさい
##データフレームの操作1
-
組み込みの「iris」データセットを確認しなさい
-
「iris」のclassを確認しなさい
-
「iris」を「d」という名前のオブジェクトに格納しなさい
-
「d」の一行目の要素を抽出しなさい
-
「d」の最初の5行と最後の5行を表示しなさい
-
「d」の列名を確認しなさい
-
3通りの方法で、「d」の1列目の要素を抽出しなさい
-
「d」の1~2行目の1列目と5列目の要素を抽出しなさい
-
「d」の「Species」が「versicolor」である行を抽出し、オブジェクト「vs」に格納しなさい
-
「vs」の「Sepal.Length」の平均値を求めなさい
-
「d」の列「Species」を抜き出し、「d」に新しい列として結合し、オブジェクト「d2」に格納しなさい
-
「d2」の5行目を抜き出し「d2」に新しい行として追加し、オブジェクト「d3」に格納しなさい
-
「d」、「d2」、「d3」の行数と列数をそれぞれ求めなさい
##データフレームの操作2
1. 1列目に各行の行数を、2列めに「iris」の「Sepal.Length」を、3列目に「iris」の「Sepal.Width」を格納したデータフレーム「e」を作成しなさい。それぞれの列名は、「id」、「Var1」、「Var2」としなさい
2. 「e」の「Var2」のclassを「numeric」から「character」に変更しなさい
3. 「e」において、5以下の「Var1」をNAに置換しなさい
4. 「e」において、「Var1」がNAの行のVar2を抽出しなさい
##データフレームの操作3
-
https://datahub.io/core/global-temp/r/monthly.csv
から月ごとの全球の気温データをダウンロードしなさい -
ダウンロードしたデータをRで読み込み、オブジェクト「f」に格納しなさい
-
「f」において、「GISTEMP」のデータのみを抜き出し、オブジェクト「g」に格納しなさい
-
gをCSVファイルとして出力しなさい
-
オブジェクト「f」を削除しなさい
-
現在ワークスペースに存在するオブジェクトすべてをRdataファイルに保存しなさい
#解答例
##コードの書き方について
ご指摘を受けていたので追記。
Rのコードの書き方については、Google’s R Style GuideやThe tidyverse style guideなどのスタイルガイドが存在する。
もし、書き方に迷ったり、コードをきれいに書きたいときにはこれらを参考にすると良いと思う。
日本語では、Rのコーディングルールについて(参考にしました)やRjpWiki Google's R Style Guideなどで確認できる。
##データ操作の初歩
#Q1
1 + 1
1 - 1
1 * 1
1 / 1
#Q2
(2.15 ** 2 + 2.33) / (12 - 10.3)
#Q3
class(3.141592)
class("Hello, World!")
#Q4
1:10
##あるいは
c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
#Q5
class(1:10)
#Q6
(1:10) * 2
#Q7
seq(1, 100, 1)
##厳密には
as.integer(seq(from = 1, to = 100, by = 1))
#Q8
##和
sum(1:100)
##平均
mean(1:100)
##あるいは
sum(seq(1, 100, 1))
mean(seq(1, 100, 1))
#Q9
rep(1, 100)
#Q10
A <- (2.15 ** 2 + 2.33) / (12 - 10.3)
B <- seq(1, 100, 1)
A + B
#Q11
C <- A + B
#Q12
length(C)
#Q13
C[37]
#Q14
C[37] <- -999
#Q14
C <- C[-76]
#Q15
C[C >= 50]
#Q16
list1 <- list(A, B, C)
##あるいは
list1 <- list(A = A, B = B, C = C)
##データフレームの操作1
#Q1
iris
##あるいは
data(iris)
print(iris)
#Q2
class(iris)
#Q3
d <- iris
#Q4
d[1, ]
#Q5
head(d)
tail(d)
##あるいは
d[1:5, ]
d[146:150, ]
#Q6
colnames(d)
#Q7
d[, 1]
d[, "Sepal.Length"]
d$Sepal.Length
#Q8
d[1:2, c(1, 5)]
#Q9
vs <- d[d$Species == "versicolor", ]
#Q10
mean(vs$Sepal.Length)
#Q11
d2 <- cbind(d, d$Species)
#Q12
d3 <- rbind(d2, d2[5, ])
#Q13
ncol(d); nrow(d)
ncol(d2); nrow(d2)
ncol(d3); nrow(d3)
##データフレームの操作2
#Q1
e <- data.frame(id = 1:nrow(iris), Var1 = iris$Sepal.Length, Var2 = iris$Sepal.Width)
#Q2
e$Var2 <- as.character(e$Var2)
#Q3
e[e$Var1 <= 5, "Var1"] <- NA
#Q4
e[is.na(e$Var1), "Var2"]
##データフレームの操作3
#Q1
##URLからダウンロード
#Q2
##CSVファイルを作業ディレクトリに移動--->
f <- read.csv("monthly.csv")
##あるいはQ1、Q2合わせて以下でも可能
f <- read.csv("https://datahub.io/core/global-temp/r/monthly.csv")
#Q3
g <- f[f$Source == "GISTEMP",]
#Q4
write.csv(g, file = "temp.csv")
#Q5
rm(f)
#Q6
save(list = ls(), file = "test.Rdata")