LoginSignup
4
5

More than 3 years have passed since last update.

R 初心者向け練習問題(四則演算~データフレーム操作)

Last updated at Posted at 2019-12-05

勉強会用に作成したものの改訂版。対象は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,~~ 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番目の要素を抜き出しなさい

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

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

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

  17. 「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 GuideThe tidyverse style guideなどのスタイルガイドが存在する。
もし、書き方に迷ったり、コードをきれいに書きたいときにはこれらを参考にすると良いと思う。
日本語では、Rのコーディングルールについて(参考にしました)やRjpWiki Google's R Style Guideなどで確認できる。

データ操作の初歩

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")
4
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5