こんにちは,shun(@datasciencemore)です!!
今回はリストとデータフレームをやっていきます.
両者ともデータを表現する上で重要な概念です.
ベクトルがわかっていることが前提ですので,必要な方はまずベクトル講座からどうぞ.
それでは,やっていきましょう.
目次
1.リスト
1.1.リストってなに??
リストっていうのはベクトルと同様,データをひとまとめにした集合体のことだよ!!
リストは,ベクトルと違って,同じデータ型じゃなくてもOKなんだ!!
リストはベクトルのパワーアップ版だと考えてください.
ベクトルは,同じデータ型しか入りませんでしたが,リストはもっと柔軟に様々なデータを扱えます.
異なるデータ型のベクトルを格納することはもちろん,リストの中にさらにリストを格納することもできちゃいます.
上が普通のベクトル,下がリストです.
上では,ベクトルなので,数値しか入っていませんが,リストの中には,ベクトルやリストが格納されていることがわかります.
このようにリストではベクトル以上に柔軟なデータの格納が可能なのです.
それでは,Rを使用してリストを作成してみましょう.
具体例として,上の図のリストと同じ内容のものを作成してみます.
1 2 3 4 5 6 7 8 9 10 11 |
list_sample = list( c(1, 3, 4, 7, 2), c("d", "a", "t", "a"), 8, list( c(2, 0, 2, 0), c("c", "a", "t") ), c(TRUE, FALSE, TRUE) ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[[1]] [1] 1 3 4 7 2 [[2]] [1] "d" "a" "t" "a" [[3]] [1] 8 [[4]] [[4]][[1]] [1] 2 0 2 0 [[4]][[2]] [1] "c" "a" "t" [[5]] [1] TRUE FALSE TRUE |
はい,できました.
出力がみづらいですね笑
リストを扱う際は,先ほどの図のように可視化してどこに何があるかを把握できるようこころがけてください.
1.2.要素の抽出
先ほど,リストを作成しました.
もちろん,リストの要素を抽出することもできますよ.
試しに今回作成したリストを抽出してみましょう.
[[]]を使用することで,要素を抽出することができます.
1 2 |
# 第2要素を抽出 (リスト付き) list_sample[2] |
1 |
[1] "d" "a" "t" "a" |
こんな感じで第2要素に格納されているベクトルが抽出されます.
リストでも同じように[]じゃいけないんですか??
実は,[]だけだとベクトルではなくて,リスト付きのベクトルが抽出されるんだ.
リストがついていないベクトルを抽出する場合は,[[]]で要素を指定しよう.
また,ややこしい話がでてきました.
図にするとこういうことです.
[]を使うとリスト付きベクトル(リストが青点線枠を示している.)が抽出され,
[[]]を使うとリストなしベクトルが抽出されるんですね.
ややこしい笑
Rでそれぞれを比較してみましょう.
1 2 |
# 第2要素を抽出 list_sample[[2]] |
1 |
[1] "d" "a" "t" "a" |
1 2 |
# 第2要素を抽出 (リスト付き) list_sample[2] |
1 2 |
[[1]] [1] "d" "a" "t" "a" |
出力が微妙に違うのがわかりますでしょうか?
この違いがリストとベクトルの違いなんですね.
1.3.名前付きリスト
ベクトルでは,名前付きベクトルといって,ベクトルの各要素に名前を付けることができました.
実はリストもベクトルと同様,各要素に名前をつけることができます.
1 2 3 4 5 6 7 8 9 10 11 |
list_sample_name = list( "one" = c(1, 3, 4, 7, 2), "two" = c("d", "a", "t", "a"), "three" = 8, "four" = list( c(2, 0, 2, 0), c("c", "a", "t") ), "five" = c(TRUE, FALSE, TRUE) ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[[1]] [1] 1 3 4 7 2 [[2]] [1] "d" "a" "t" "a" [[3]] [1] 8 [[4]] [[4]][[1]] [1] 2 0 2 0 [[4]][[2]] [1] "c" "a" "t" [[5]] [1] TRUE FALSE TRUE |
こちらもベクトルと同様,名前からアクセスすることができます.
[[]]を使う方法と$を使う方法の2パターンがあります.
どちらも結果は同じですが,$を使うほうがよく使います.
1 2 3 4 5 |
# 名前から第1要素にアクセス その1 list_sample_name[["one"]] # 名前から第1要素にアクセス その2 list_sample_name$one |
1 |
[1] 1 3 4 7 2 |
なかなかボリュームありますね.
ここではいお疲れ様といいたいのですが,申し訳ございません.まだデータフレームがあります...
しかし,リストが理解できていればデータフレームは余裕なので,気楽な気持ちでいきましょう.
それでは,次章からデータサイエンティストであれば誰もがお世話になっているデータフレームについてやっていきましょう.
2.データフレーム
2.1.データフレームってなに??
データフレームは行数がどの列も同じ名前付きリストのことだよ!!
データフレームはイメージしやすいのではないでしょうか?
こんな感じで行と列からできてる2次元の表をイメージしてください.
もう説明するまでもないですね笑
データサイエンティストであろうがなかろうが,このような2次元の表は仕事してるとよく見ると思います.
多くの人たちがExcelを使用して,このような2次元の表を扱っていると思います.
さて,そんな誰からも大人気であるデータフレームですが,Rではこんな感じで作成します.
1 2 3 4 |
df = data.frame( season = c("spring", "summer", "autumn", "winter"), avg_temp = c(22, 30, 18, 9) ) |
1 2 3 4 5 |
season avg_temp 1 spring 22 2 summer 30 3 autumn 18 4 winter 9 |
さ,こんな感じで一見簡単に見えるデータフレームですが,実はこれ,名前付きリストの特別版です.
リストとデータフレームを比較してみましょう.
図をみればわかりやすいと思います.
リストでは,各要素に入っているベクトルの長さがバラバラですが,データフレームでは,どの要素でもベクトルの長さが同じ(この例の場合,3)ですね.
ですから,データフレームは,名前付きリストに一部制限がかかった特別版といえるのです.
まぁ,名前付きリストと比較するとデータフレームのほうが圧倒的に扱うことが多いので,普段はそこまで意識しなくてもいいです笑
2.2.要素の抽出
データフレームは,名前付きリストでもあるので,当然名前付きリストで学んだように,要素を抽出できます.
1 2 3 4 5 |
# 名前から第1要素にアクセス その1 df[["season"]] # 名前から第1要素にアクセス その2 df$season |
1 |
[1] "spring" "summer" "autumn" "winter" |
名前付きリストと同様,[[]]でも$でも両方アクセスできますが,$のほうがよく使います.
また,データフレームは,行と列を指定することで,該当する箇所を抽出することができます.
1 2 |
# 1行目,3行目のseason列,avg_temp列を抽出 df[c(1, 3), c("season", "avg_temp")] |
1 2 3 |
season avg_temp 1 spring 22 3 autumn 18 |
1.3.データフレームの進化系 tibble
実はデータフレームはtibbleというより機能が充実した進化系があります.
tibbleを使用すればデータフレームを使用する必要はないです.
tibbleについては,別記事で詳細に説明するので,今はそんなんあるんだぁくらいに思っていてください.
なお,ぼくのブログでは基本,tibbleもデータフレームって言い方をします.
データフレームって言い方はRでもPythonでも共通なのでそちらのほうがわかりやすいですから笑
まとめ
今回は,リストとデータフレームについてやってきました.
ざっくり次のような理解をしてください.
リスト:どのようなデータでも入れられる.
データフレーム:名前付きリストの特別版でどの列でも行数が同じ.
データフレームはtibbleという進化系があるのでこうご期待!
お疲れ様でした!!