統計学と疫学と時々、助教生活

疫学を専門とする助教の研究に関する備忘録的ページ。

R for beginners vol.1 「Rの紹介と基本的なコマンド」

今回から全部で5回ほどに分けて、Rの基本をマスターできる記事(全くの知識がない者向け)を一週間おきに公開する。
Rのコマンド等は言うまでもなくたくさんの方が公開されているので、そちらを参照して頂いた方が良いかもしれない。
一回あたり1.5hを目安に、全部で8h程度の時間を割いて、この記事を読みながら手を動かせばRへのアレルギーみたいなものは取り除かれると思う。

Rの機能や説明は今回は省くことをご承知ください。
それでは早速、初回の「Rの紹介と基本的なコマンド」を始めます。

【今日の狙い】基本的なRのコードを理解し、簡単なデータセットの扱い方を学習する。(これが今後の基本になります)

導入:計算したり、文字列を記憶させる。(大文字小文字の違いには要注意)
x <- 2 

X+2 
##エラー:  オブジェクト 'X' がありませんと言われます

x*4 #かけ算は*(アスタリスク)を使います
## [1] 8

x = 3 #"="と"<-"は同義です。

x+3 #足し算
## [1] 6

x^3 #累乗の計算
## [1] 27

name <- "Ryosuke FUJII" #文字列の記述には""(ダブルクォーテーション)を使用
name
## [1] "Ryosuke FUJII"

1. c(x)(鎖状にするという意味のconcatenateのc)

最も基本的なコマンドの一つで、文字列や数値などのベクトルを生成する時に使用する。

x <- c(1,4,5,8)
x
## [1] 1 4 5 8

name2 <- c("Ryosuke", "FUJII")
name2
## [1] "Ryosuke" "FUJII"

2. class(x)

データのタイプを返すコマンド(クラスをきちんと定義することは要約統計量を求める時や解析を行う時は重要である)
ベクトルのクラスとしては以下に示すものになる。
文字列 (character) : "FHU", "日本語も大丈夫ですが、扱いにくい"
数値 (numeric): 1201, 23.444, 0.3949
整数 (integer): 1, 39, -2229
因子 (factor): 1, 2, 3(数字)もしくは "L", "M", "H"(文字も可能)
二値 (logical): TRUEもしくはFALSEの変数

x <- c(1, 2, 3, 4, 5, 10, 9, 8, 7, 6)
class(x)
## [1] "numeric"

num <- seq(1, 10, by=2) #初項1、公差2の等差数列
num
## [1] 1 3 5 7 9

class(num)
## [1] "numeric"

y <- c("M", "F", "F", "M", "F")
class(y)
## [1] "character"

z <- 1:5
class(z)
## [1] "integer"

sex <- factor(y)
sex
## [1] M F F M F
## Levels: F M

class(sex)
## [1] "factor" 

#レベルの順序はアルファベットの順番になっていることに注意
factor(y, levels = c("M", "F"))
## [1] M F F M F
## Levels: M F

a <- c(TRUE, FALSE, TRUE, FALSE, TRUE)
class(a)
## [1] "logical"

3. length(x)

ベクトル内の要素の数を返すコマンド

length(x)
## [1] 10

length(y)
## [1] 5

length(name)
## [1] 1

length(name2)
## [1] 2

4. head(x)とtail(x)

headはRのオブジェクトの始めの6つの要素(デフォルト)を、tailは終わりの6つの要素(デフォルト)を返す。

head(x)
## [1]  1  2  3  4  5 10

tail(x)
## [1]  5 10  9  8  7  6

#head(データ, 数字)でどれだけ表示するか決めることもできる。(ベクトルだけでなく、データセットにも応用できるので便利)
head(x, 4)
## [1] 1 2 3 4

5. str(x)(補足的にunique(x))

ベクトルの情報を得る場合に使用できる。データのタイプと長さ、その中身まで返す。

str(x)
## num [1:10] 1 2 3 4 5 10 9 8 7 6

str(name2)
## chr [1:2] "Ryosuke" "FUJII"

unique(name2)
## [1] "Ryosuke" "FUJII"

6. table(x)

文字列と因子のベクトルに有効で、簡易な表を作成する。

table(y)
## y
## F M 
## 3 2

table(sex)
## sex
## F M 
## 3 2 

7. 簡単なデータサブセットの方法[x,y]

このサブセットは非常にシンプルである一方頻繁に使用するコマンドで、データフレームの中で特定の列や行、個人を特定する場合に有用である。

length(x)
## [1] 10

x[1]
## [1] 1

x[4:8]
## [1]  4  5 10  9  8

x[c(4, 5, 6, 7, 8)]
## [1]  4  5 10  9  8

x1 <- x[c(1,3,5,7)]
x1
## [1] 1 3 5 9

8. mean(x), median(x), min(x), max(x), sd(x), sum(x)

簡単な統計量の算出に使用できるコマンド。

mean(x)
## [1] 5.5

median(x)
## [1] 5.5

min(x)
## [1] 1

max(x)
## [1] 10

sd(x)
## [1] 3.02765

sum(x)
## [1] 55

ここまで学習したコマンドも参考にして、データ解析で最も使用する行列やデータフレームの形式に有用なコマンドを紹介する。

9. nrow(x), ncol(x), dim(x), colnames(x)

n <- 1:9
n
## [1] 1 2 3 4 5 6 7 8 9

mat <- matrix(n, nrow=3)
mat
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9

nrow(mat)
## [1] 3

ncol(mat)
## [1] 3

dim(mat)
## [1] 3 3

10. データの選択(7で紹介したものの行列バージョン)

#一行目、一列目の数字を返す
mat[1, 1]
## [1] 1

#一行目の数字を返す
mat[1,]
## [1] 1 4 7

#一列目の数字を返す
mat[,1]
## [1] 1 2 3

#一行目と三行目の数字を返す
mat[c(1,3), ]
##     [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    3    6    9

11. データフレームの操作(今回のまとめ:irisデータを使用する)

#iris内の列名を表示する
names(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"  

#iris内の構造(次元と変数、変数のクラス、列名等を把握できる)
str(iris)
##  'data.frame':	150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

#irisの始めの6行を表示する
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

#irisのSepal.Lengthの始めの6つのデータを表示する。『データセット$列名』と言うコマンドはよく使用する。
head(iris$Sepal.Length)
## [1] 5.1 4.9 4.7 4.6 5.0 5.4

#上のコマンドと同義。一列目を指定している。
head(iris[,1])
## [1] 5.1 4.9 4.7 4.6 5.0 5.4

#Petal.Widthのclassを表示している。
class(iris$Petal.Width)
## [1] "numeric"

#Petal.Widthの種類を表示している。
unique(iris$Petal.Width)
## [1] 0.2 0.4 0.3 0.1 0.5 0.6 1.4 1.5 1.3 1.6 1.0 1.1 1.8 1.2 1.7 2.5 1.9 2.1
## [19] 2.2 2.0 2.4 2.3

#Petal.Widthの種類の数を表示している。
length(unique(iris$Petal.Width))
## [1] 22

#irisの中でも"Petal.Width"と"Species"のみの始めの10個のデータを表示する。
head(iris[, c("Petal.Width", "Species")], 10)
##    Petal.Width Species
## 1          0.2  setosa
## 2          0.2  setosa
## 3          0.2  setosa
## 4          0.2  setosa
## 5          0.2  setosa
## 6          0.4  setosa
## 7          0.3  setosa
## 8          0.2  setosa
## 9          0.2  setosa
## 10         0.1  setosa

#新しい列(index)をirisに追加する
iris$index <- 1:150
str(iris)
## 'data.frame':	150 obs. of  6 variables:
## $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ index       : int  1 2 3 4 5 6 7 8 9 10 ...

練習問題(全 21 問)

1. 'my.num'と言う 5 つの数字を含む新しい変数を作れ.
2. 'my.num'に 3 をかけろ.
3. 'my.char'と言う 4 つの文字列を含む新しい変数を作れ.
4. 'my.num'と'my.char'を結合し,'both'と呼ばれる新しい変数を作れ.
5. 'both'の長さはいくつか答えろ.
6. 'both'のクラスは何か答えろ.
7. 'both'を 3 で割ると何が起きるか.
8. 1, 2, 3, 4, 5 を含むベクトルを作成し, x と名付けよ.
9. 10, 20, 30, 40 を含む別のベクトルを作成し, y と名付けよ.
10. x と y を足そうとすると何が起きるか.またそれはなぜか答えよ.
11. y に 50 と言う数字を新しく加えろ. (ヒント: c() )
12. 再度、x と y を足しあわせろ.
13. x と y を掛け合わせろ.
'CO2'はデフォルトとして R のデータセットに入っているので、head(CO2)でその中身 を見ることはできる。
14. 'CO2'のクラスは何か答えよ.
15. 'CO2'にはいくつの観察数(行)と変数(列)があるか答えよ.
16. いくつの異なる種類の"plants"がデータには存在するか答えよ. (ヒント: 'length' and 'unique')
17. いくつの異なる種類の"types"がデータには存在するか答えよ. 18. "type"と"treatment"で表を作成せよ.
19. 'CO2'の奇数行のみを含む'CO2.odd'と言う新しいデータフレームを作成せよ. (ヒ ント: subsetting and 'seq' (note the 'by' argument))
20. 'CO2.odd'にはいくつの観察数(行)が存在するか答えよ.
21. 'CO2.odd'の 1) concentrations と 2) uptake values の合計はいくつか答えよ.

今回はここまでにする。次回(vol.2)は予定通りであれば、5/19にUPする。


2016512
RF