DB/R/統計/データサイエンス/投資話についてつらつらと

世のため自分のためのアウトプット

R 解説記事

【R言語の備忘録】様々な条件でのデータの選択方法【列・行・最大値・最小値】

投稿日:

R言語での、データの抽出方法について紹介します。

以下で使用するデータは、batter_YY にYY年の打者成績が入っています。
※使用するデータはすべてプロ野球データFreak様からお借りしています。
プロ野球データFreak

~目次~

1. data.frameからの"列"データの抽出

2. data.frameからの"行"データの抽出

3. 条件を指定したデータの抽出

4. 最大値/最小値

1. data.frameからの列データの抽出

単一列を指定する場合は、$列名で指定する方法と、配列[ , n]のように列番号や列名を指定する方法があります。

> #打率の列を抽出
> head(batter_17$打率)
[1] 0.413 0.332 0.322 0.311 0.310 0.298> head(batter_17[, "打率"])
打率
1 0.413
2 0.332
3 0.322
4 0.311
5 0.310
6 0.298&
> #4列目を抽出
> head(batter_17[, 4])
打率
1 0.413
2 0.332
3 0.322
4 0.311
5 0.310
6 0.298

複数列の場合は、配列[ , n:m]のように配列で指定する方法があります。

> #2列目から4列目を抽出
> head(batter_17[ , 2:4])
選手名 チーム 打率
1 近藤 健介 日本ハム 0.413
2 大谷 翔平 日本ハム 0.332
3 秋山 翔吾 西武 0.322
4 吉田 正尚 オリックス 0.311
5 柳田 悠岐 ソフトバンク 0.310
6 山川 穂高 西武 0.298
> #列名が、選手名・チーム・打率の列を指定
> head(batter_17[, c("選手名", "チーム","打率")])
選手名 チーム 打率
1 近藤 健介 日本ハム 0.413
2 大谷 翔平 日本ハム 0.332
3 秋山 翔吾 西武 0.322
4 吉田 正尚 オリックス 0.311
5 柳田 悠岐 ソフトバンク 0.310
6 山川 穂高 西武 0.298

また、-(マイナス)を使用することで、特定の行のみ省略できます。
以下では、2番目の大谷選手が、-2をつけることで消えているのがわかります。
(今回はheadを使っているので、内川選手が繰り上がっています)

> head(batter_17$選手名)
[1] 近藤 健介 大谷 翔平 秋山 翔吾 吉田 正尚 柳田 悠岐 山川 穂高
> head(batter_17[-2, ]$選手名)
[1] 近藤 健介 秋山 翔吾 吉田 正尚 柳田 悠岐 山川 穂高 内川 聖一

なお、","については、列の抽出の場合は無視できるのですが、行と列のどちらを指定しているのか分かりやすいので、付けることを推奨します。
(以下の列の抽出の場合は必須です)

2. data.frameからの行データの抽出

行については配列[n, ]で抽出できます。

> #n行目を抽出
> batter_17[1, ]
順位 選手名 チーム 打率 試合 打席数 打数 安打 本塁打 打点 盗塁 四球 死球 三振 犠打 併殺打 出塁率
1 1 近藤 健介 日本ハム 0.413 57 231 167 69 3 29 3 60 2 27 0 3 0.567
長打率 OPS RC27 XR27
1 0.557 1.124 14.7 13.85

複数行抽出する場合も、列と同様にできます。

> #2,4行目を抽出
> batter_17[c(2,4), ]
順位 選手名 チーム 打率 試合 打席数 打数 安打 本塁打 打点 盗塁 四球 死球 三振 犠打 併殺打 出塁率
2 2 大谷 翔平 日本ハム 0.332 65 231 202 67 8 31 0 24 2 63 0 0 0.403
4 4 吉田 正尚 オリックス 0.311 64 268 228 71 12 38 1 38 1 32 0 9 0.410
長打率 OPS RC27 XR27
2 0.540 0.942 8.44 8.17
4 0.518 0.928 7.41 7.20

3. 条件付きの列の抽出

要素名[条件式]と記載します。

例:
初めのbatter_17 [batter_17$打率>0.3, ] で打率が3割以上の打者を抽出します。
その後$選手名で、選手名のデータだけ取り出しています。

> batter_17[batter_17$打率>0.3, ]$選手名
[1] 近藤 健介 大谷 翔平 秋山 翔吾 吉田 正尚 柳田 悠岐

ちなみに、batter_17$打率>0.3 は単独で実行すると下記になります。

> batter_17$打率>0.3
[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[35] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[52] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[69] FALSE FALSE FALSE FALSE FALSE FALSE

これはどういうことかというと、batter_17$打率>0.3で条件を満たす列を"TRUE", 満たさない列を"FALSE"とし、batter_17[batter_17$打率>0.3]で、打率>0.3がTRUEとなる行をbatter_17から抽出しています。
そのため、TRUEが5つあることから、上位5名が3割以上打っている事がわかります。

複数の条件両方合致する(and)条件で抽出するには、&で繋げます。
以下は打率2割8分以上かつ本塁打が20本以上の選手を抽出しています。

> batter_17[batter_17$打率>0.28 & batter_17$本塁打 > 20, ]$選手名
[1] 秋山 翔吾 柳田 悠岐 山川 穂高 ペゲーロ

複数の条件いずれかに合致する(or)条件で抽出するには 、|(バーティカルバー) で繋げます。
以下は打率3割と本塁打30本のどちらかを満たす選手を抽出しています。

> batter_17[batter_17$打率>0.3 | batter_17$本塁打 > 30, ][c("選手名", "打率","本塁打")]
選手名 打率 本塁打
1 近藤 健介 0.413 3
2 大谷 翔平 0.332 8
3 秋山 翔吾 0.322 25
4 吉田 正尚 0.311 12
5 柳田 悠岐 0.310 31
22 ウィーラー 0.271 31
26 T-岡田 0.266 31
32 デスパイネ 0.262 35
55 レアード 0.229 32

4. 最大値/最小値

最大値はと最小値は以下で求められます。

最大値:max(配列)
最小値:min(配列)

以下で例を示します。

> max(batter_17$打率)
[1] 0.413
> min(batter_17$打率)
[1] 0.17

最大値を持つ行の他の値を知りたいときは、以下のようにします。
batter_17$打率 == max(batter_17$打率)が条件式となっており、それを満たす列をまず選択します。
続いて、[,c("選手名", "チーム")]で、選手名とチームの行を抽出しています。

> batter_17[batter_17$打率 == max(batter_17$打率),][,c("選手名", "打率", "チーム")]
選手名 打率 チーム
1 近藤 健介 0.413 日本ハム
> batter_17[batter_17$打率 == min(batter_17$打率),][,c("選手名", "打率", "チーム")]
選手名 打率 チーム
74 市川 友也 0.17 日本ハム

ちなみに、2016年と2018年の打席数が規定打席1/3以上の打率の最大は以下になっています。
規定打席は満たしていませんが、2017年の近藤選手の打率の高さが分かりますね。

> batter_18[batter_18$打率 == max(batter_18$打率),][,c("選手名", "打率", "チーム")]
選手名 打率 チーム
1 柳田 悠岐 0.352 ソフトバンク
> batter_16[batter_16$打率 == max(batter_16$打率),][,c("選手名", "打率", "チーム")]
選手名 打率 チーム
1 岡 大海 0.374 日本ハム

なお、データの型が数値でないものに使用すると、以下のようにエラーとなります。

> min(batter_17$チーム)
Summary.factor(c(6L, 6L, 5L, 1L, 2L, 5L, 2L, 6L, 4L, 1L, 4L, でエラー:
‘min’ は因子に対しては無意味です

以上です。

-R, 解説記事

Copyright© 世のため自分のためのアウトプット , 2020 All Rights Reserved Powered by STINGER.