R　初心者向け練習問題（四則演算～データフレーム操作）

勉強会用に作成したものの改訂版。対象はRを少し触ったことがあるくらいの人達。
Rの授業というと教える人が実演する→各自が真似する、という流れが多い気がする。でもそれだとあまり身につかない。
まずは訳が分からなくても触ってみる→そのあと説明を聞いて納得する、という流れで慣れることができ、理解につながると思う。

2020年3月4日追記：
コードを[The tidyverse style guide](https://style.tidyverse.org/)に沿うよう書き直しました。

#問題

各セクションを自分で調べながらとりあえずやってみる→答えを見て操作を覚える、という風に使うことを想定しています。

※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,~~ 1\times1,~~ 1\div1 $をRで計算しなさい

2.  次の値をRで計算しなさい
$$ \frac{2.15^2 + 2.33}{12-10.3} $$

3.  次の数値、文字列のclassを確認しなさい
    **3.141592　"Hello, World!"**

4.  1~10までの整数が順番に入ったベクトルを作りなさい

5.  問4のベクトルのクラスを確認しなさい

6.  R上で次のベクトル操作を行いなさい
    **問4のベクトルの各値に2をかけたベクトルを作成**

7.  関数を使って、1~100までの整数が順番に入ったベクトルを作りなさい

8.  関数を使って、1〜100までの整数の和と平均を求めなさい

9.  関数を使って、1が100個入ったベクトルを作りなさい

10.  問2の答えと問7の答えをそれぞれオブジェクト「A」と「B」に格納し、足し合わせなさい

11.  問10の答えをオブジェクト「C」に格納しなさい

12.  関数を使って「C」の要素数を求めなさい

13.  「C」の37番目の要素を抜き出しなさい

13.  「C」の37番目の要素を−999に置換しなさい

14.  「C」の76番目の要素を削除しなさい

15.  「C」の要素の中で、50以上のものを求めなさい

16.  「A」と「B」と「C」を格納したリスト「list1」を作成しなさい


##データフレームの操作1
1. 組み込みの「iris」データセットを確認しなさい

2. 「iris」のclassを確認しなさい

3. 「iris」を「d」という名前のオブジェクトに格納しなさい

4. 「d」の一行目の要素を抽出しなさい

5. 「d」の最初の5行と最後の5行を表示しなさい

6. 「d」の列名を確認しなさい

7.  3通りの方法で、「d」の1列目の要素を抽出しなさい

8. 「d」の1~2行目の1列目と5列目の要素を抽出しなさい

9. 「d」の「Species」が「versicolor」である行を抽出し、オブジェクト「vs」に格納しなさい

10. 「vs」の「Sepal.Length」の平均値を求めなさい

11. 「d」の列「Species」を抜き出し、「d」に新しい列として結合し、オブジェクト「d2」に格納しなさい

12. 「d2」の5行目を抜き出し「d2」に新しい行として追加し、オブジェクト「d3」に格納しなさい

13.  「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
1. 　https://datahub.io/core/global-temp/r/monthly.csv
から月ごとの全球の気温データをダウンロードしなさい

2. 　ダウンロードしたデータをRで読み込み、オブジェクト「f」に格納しなさい

3. 　「f」において、「GISTEMP」のデータのみを抜き出し、オブジェクト「g」に格納しなさい

4. 　gをCSVファイルとして出力しなさい

5. 　オブジェクト「f」を削除しなさい

6. 　現在ワークスペースに存在するオブジェクトすべてをRdataファイルに保存しなさい



#解答例

##コードの書き方について
ご指摘を受けていたので追記。
Rのコードの書き方については、[Google’s R Style Guide](https://google.github.io/styleguide/Rguide.html)や[The tidyverse style guide](https://style.tidyverse.org/)などのスタイルガイドが存在する。
もし、書き方に迷ったり、コードをきれいに書きたいときにはこれらを参考にすると良いと思う。
日本語では、[Rのコーディングルールについて](http://rstudio-pubs-static.s3.amazonaws.com/85463_ab84b5964c4c4c129d8601dc495b4e51.html)（参考にしました）や[RjpWiki Google's R Style Guide](http://www.okadajp.org/RWiki/?Google%27s%20R%20Style%20Guide)などで確認できる。

##データ操作の初歩
```data_manipulation_answer.r
#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
```df1_answer.r
#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
```df2_answer.r
#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
```df3_answer.r
#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")
```