![スクリーンショット_2018-09-04_17](https://assets.st-note.com/production/uploads/images/7701188/rectangle_large_type_2_4efbc66725c8db2f2f506435b94e5999.jpg?width=1200)
Edx:ハーバード大学のデータサイエンス(R)学習記録4
最近Pythonでのデータスクレイピングが話題ですが、統計を勉強してきた人にはRも有名です。Rを勉強するには書籍も多くありますが、オンラインで世界の大学の講義が無料で受けられるEdxにもRを学べる講座があります。
Edxは前編英語なのですが、実はgoogle cromeの自動翻訳機能で動画まで翻訳してくれるので案外なんとかなったりします。
Edxは日本では馴染みが無いようなので、自分への備忘録と「英語できなくてもEdxでここまでできた」という過程を上げていきたいと思います。
ハーバード大学が提供する「データサイエンス:Rの基礎」
前回はセクション1でしたが、今回はセクション2.2「並べ替え」と2.3「ベクトル演算」です。
使う表
以下の表をを使います。5人の年齢・身長・体重・性別を並べています。
> 氏名 <- c("山田","鈴木","吉田","田中","山口")
> 年齢 <- c(65,46,86,76,45)
> 身長 <- c(165,147,163,158,173)
> 体重 <- c(48,50,62,64,67)
> 性別 <- c("男性","女性","女性","男性","女性")
> data <- data.frame(氏名,年齢,身長,体重,性別)
> data
氏名 年齢 身長 体重 性別
1 山田 65 165 48 男性
2 鈴木 46 147 50 女性
3 吉田 86 163 62 女性
4 田中 76 158 64 男性
5 山口 45 173 67 女性
sort関数
> data$年齢
[1] 65 46 86 76 45
> sort(data$年齢)
[1] 45 46 65 76 86
> data$年齢
[1] 65 46 86 76 45
sort()関数を使うと指定されたベクトル(ここでいうと年齢)の少ない順に表示してくれます。しかしエクセルの並べ替えと違いあくまでも少ない順を教えてくれるだけで表の順番自体が変わっているわけではないことに注意が必要です!そのため、再度"data$年齢"と打ってみると並べ替える前の順番が出ています。
order関数
> data$年齢
[1] 65 46 86 76 45
> sort(data$年齢)
[1] 45 46 65 76 86
[1] 45(元々は5番目) 46(元々は2番目) 65(元々は1番目)76(元々は4番目)86(元々は3番目)
> order(data$年齢)
[1] 5 2 1 4 3
order関数はsortの順番が元々の何番目にあるかを教えてくれる関数
ベクトルの後の[ ]の使い方
data
氏名 年齢 身長 体重 性別
1 山田 65 165 48 男性
2 鈴木 46 147 50 女性
3 吉田 86 163 62 女性
4 田中 76 158 64 男性
5 山口 45 173 67 女性
> data$身長[2:4]
[1] 147 163 158
> data$氏名[2:4]
[1] 鈴木 吉田 田中
ベクトル(ここではdata$身長)の後に[番号]をつけるとその番号の順に表示してくれます。ここでは[2:4]→[2,3,4]→「身長の(元の表の)2個目,3個目,4個目を表示して」となり「147 163 158」が表示されました。
同様にdata$氏名[2:4]と入力すると「鈴木 吉田 田中」が表示されます。
indexを使った応用
> data$年齢
[1] 65 46 86 76 45
> sort(data$年齢)
[1] 45 46 65 76 86
[1] 45(元々は5番目) 46(元々は2番目) 65(元々は1番目)76(元々は4番目)86(元々は3番目)
> order(data$年齢)
[1] 5 2 1 4 3
###下から###
> index <- order(data$年齢)
> data$年齢[index]
[1] 45 46 65 76 86
> data$氏名[index]
[1] 山口 鈴木 山田 田中 吉田
index <- order(data$年齢)でindexには(5,2,1,4,3)という数字が入ります。
そしてdata$年齢の後に[index]をつけると「data$年齢をindexの順番に表示して」という命令になります。つまりsort関数と同じ意味ですね。
今indexには年齢順の数字が並んでいます。これを使うと下のようなこともできます。
> data$氏名[index]
[1] 山口 鈴木 山田 田中 吉田
とすると年齢順に名前を並べ替えて表示してくれます。
> x <- c(1,2,3,NA,5,6,NA,8,9,10)
> mean(x)
[1] NA
> index <- is.na(x)
> mean(x[!index])
[1] 5.5
> x <- c(1,2,3,NA,5,6,NA,8,9,10) #いくつか欠損値のあるデータ
> mean(x) #平均を求める
[1] NA #NAが出る(NAがあると平均を求められない)
> index <- is.na(x) #indexにNAが入っている番号を入れる
> x[!index] #NAが入っていない数字だけを出してみる
[1] 1 2 3 5 6 8 9 10 #NAが消えた!
> mean(x[!index]) #平均を出す
[1] 5.5 #平均が出た
欠損値データが入っている場合平均が計算できません。
その場合is.na関数を使うと欠損値が何番目にあるかを教えてくれます。
[!index]はindexの番号以外という意味
maxとwhich.max
> max(data$身長)
[1] 173
> which.max(data$身長)
[1] 5
> i_max <- which.max(data$身長)
> data$氏名[i_max]
[1] 山口
> min(data$身長)
[1] 147
> which.min(data$身長)
[1] 2
> i_min <- which.max(data$身長)
> data$氏名[i_min]
[1] 山口
max関数はそのベクトル(ここではdata$身長)の最大値を表示してくれます。minなら最小値。
そしてwhich.maxはsort関数のように最大値があるのは何番目?を表示します。
sort関数と同様にindex(ここではi_max)を使って身長が最大の人の名前を出すこともできます。
rank関数
> data$身長
[1] 165 147 163 158 173
> rank(data$身長)
[1] 4 1 3 2 5
165(4番目に少ない) 147(1番少ない) 163(3番目に少ない) 158(2番目に少ない) 173(5番目に少ない)
rank関数は(元のベクトルが)どの何番目なのかを出す関数です。
ベクトル演算
> 身長m <- data$身長/100
> 身長m
[1] 1.65 1.47 1.63 1.58 1.73
こんな感じでベクトルに四則計算(+,-,×,÷)ができます。
足す:+
引く:-
かける:*
割る:/
二乗:^
まとめ
・sort, order, rank関数ともに実際の表やベクトル自体を並べ替えるものではない(この関数を使ったからといって元のデータ自体を変更して保存するものではない)。
・sortは並べ替えた数字を表示する
・orderは並べ替えた数字が元のベクトルの何番目に当たるかを表示
・order, which.max, which.minはindexを使い応用できる
・rankは順番は(元のベクトルが)どの何番目かをランキングとして出す
番外編
並べ替えの別方法
> age <- data$年齢 #年齢にageという名前をつける
> age
[1] 65 46 86 76 45 #ageと入れるともちろんdata$年齢と同じものが出る
> age <- sort(age) #sort(age)を改めてageに入れる
> age
[1] 45 46 65 76 86 #ageと入れるとsortされた物が出てくる
> age[1] #既にsortされてるので、age[1]は1番少ない数字になる
[1] 45
order(data$年齢)[1] #data$年齢で並べ替えた数字がそれぞれ何番目かを表示しその1番目を表示
[1] 45 #上と同じ結果になる
テストはかなり疲れました。テストはビデオの内容を使いこなせるレベルにならないと回答できないレベルになってきています。ビデオを見るだけでは簡単に答えられなくて、試行錯誤しながらようやく回答できる頃には1つレベルアップしているという感覚です。
次はセクション3になります。
この記事が気に入ったらサポートをしてみませんか?