rename()
で列の名前を変更するmutate()
で列の中身を変えるarrange()
で行を並び替えるfilter()
で行を絞り込むstudents_analysis.zip
をダウンロードして、デスクトップで解凍してください。
students_analysis
フォルダー内のstudents_analysis.Rproj
をダブルクリックして、プロジェクトを開いてください。students.R
のコードを実行してデータを読み込み、整理してください。早速チャレンジに取り組みましょう。
students
から食事プランが"Lunch only"
の学生を抽出し、名前をZからAの順に並べ替えてください。
この方法でも解析が短い場合は問題ありませんが、長くなると大変です。
パイプを使うとこの問題を解決できます。
|>
)の基本的な使い方を覚えましょう。
%>%
と書いていましたが、最近のRでは|>
が使われます。arrange(データ, 列名)
のように書いてきましたが、パイプを使うと次のように書けます:データ |> arrange(列名)
|>
は左側のものを右側へ渡す機能があります。試してみましょう。
# A tibble: 6 × 5
student_id full_name favourite_food meal_plan age
<dbl> <chr> <chr> <chr> <dbl>
1 3 Jayendra Lyne N/A Breakfast and lunch 7
2 5 Chidiegwu Dunkel Pizza Breakfast and lunch NA
3 1 Sunil Huffmann Strawberry yoghurt Lunch only 4
4 2 Barclay Lynn French fries Lunch only 5
5 4 Leon Rossini Anchovies Lunch only NA
6 6 Güvenç Attila Ice cream Lunch only 6
students |> arrange(meal_plan)
と
arrange(students, meal_plan)
は同じ意味です。
# A tibble: 4 × 5
student_id full_name favourite_food meal_plan age
<dbl> <chr> <chr> <chr> <dbl>
1 2 Barclay Lynn French fries Lunch only 5
2 6 Güvenç Attila Ice cream Lunch only 6
3 4 Leon Rossini Anchovies Lunch only NA
4 1 Sunil Huffmann Strawberry yoghurt Lunch only 4
# A tibble: 4 × 5
student_id full_name favourite_food meal_plan age
<dbl> <chr> <chr> <chr> <dbl>
1 2 Barclay Lynn French fries Lunch only 5
2 6 Güvenç Attila Ice cream Lunch only 6
3 4 Leon Rossini Anchovies Lunch only NA
4 1 Sunil Huffmann Strawberry yoghurt Lunch only 4
|>
を見たら、「それから」と読むと理解しやすいです:
students
から始めて、それから食事プランが”Lunch only”の学生に絞り込んで、それから学生の名前順に並び替える
パイプを使ってstudents
からstudent_id
が2より大きい行だけに絞り、favourite_food
の順で並び替えてください。
age
にはNA
という値が含まれています。
NA
は「Not Applicable」(「該当しない」)を意味します。
age
の場合、何らかの理由でその人の年齢がわからないことを意味します。is.na()
関数は、その値がNA
であるかを確認してくれます。使ってみましょう。
# A tibble: 2 × 5
student_id full_name favourite_food meal_plan age
<dbl> <chr> <chr> <chr> <dbl>
1 4 Leon Rossini Anchovies Lunch only NA
2 5 Chidiegwu Dunkel Pizza Breakfast and lunch NA
あら、これはまずいですね。欠測データだけが抽出されてしまいました。
私たちが欲しいのは、その逆です。
!
は論理ベクトルを反転させます。
TRUE
をFALSE
に、FALSE
をTRUE
にします。「否」と読むと理解しやすいです。!
を使って、NA
ではないデータだけに絞り込みましょう。# A tibble: 4 × 5
student_id full_name favourite_food meal_plan age
<dbl> <chr> <chr> <chr> <dbl>
1 1 Sunil Huffmann Strawberry yoghurt Lunch only 4
2 2 Barclay Lynn French fries Lunch only 5
3 3 Jayendra Lyne N/A Breakfast and lunch 7
4 6 Güvenç Attila Ice cream Lunch only 6
students
からage
がNA
になっている行を除外してから、favorite_food
の順で並び替えてください。(パイプを使ってください)
特にデータが大きい場合、解析に不要な列があることがあります。
必要な列だけに絞ることで、解析がやりやすくなります。
select()
です。例えば、student_id
、full_name
、meal_plan
を選択します:# A tibble: 6 × 3
student_id full_name meal_plan
<dbl> <chr> <chr>
1 1 Sunil Huffmann Lunch only
2 2 Barclay Lynn Lunch only
3 3 Jayendra Lyne Breakfast and lunch
4 4 Leon Rossini Lunch only
5 5 Chidiegwu Dunkel Breakfast and lunch
6 6 Güvenç Attila Lunch only
rename()
で列の名前を変更するmutate()
で列の内容を変更するselect()
で列を選択するarrange()
で行を並び替えるfilter()
で行を絞り込むgapminder
これから学ぶ関数はもっと大きなデータで使用するため、新しいプロジェクトを作成します。
このプロジェクトではgapminder
というデータセットを使用します。1952年から2007年までの各国の経済データが含まれています(第4回の課題でも使用しました)。
gapminder
プロジェクトの作成gapminder_analysis
というプロジェクトを作成し、そのプロジェクトを開いてください。gapminder
プロジェクトの作成gapminder_analysis
の中に保存してください:https://moodle.gs.chiba-u.jp/moodle/mod/resource/view.php?id=1295476
gapminder
プロジェクトの作成gapminder.R
というRファイルを作成し、gapminder
というデータセットを読み込むコードを書きます:今まで学んだ関数はデータフレームの値を個別に扱いました(主に列か行に対する処理を行ってきました)。
しかし、データフレームに含まれる値の平均や合計を計算したい場合には、さらに操作が必要です。
count()
で数えるデータの全体像を掴むために、まず数を数えることは有効です。
例えば、gapminder
にいくつの国が含まれているかを数えます。
count()
のような集計関数の結果は、入力のデータと大きく異なります!summarize()
を使うsummarize()
(「集計する」)の使い方はmutate()
と似ています。
summarize(データ, 新しい列名 = コマンド)
mean()
は平均を計算する関数です。min()
は最小値を返す関数です。summarize()
によく使う計算のコマンド集計をする際、以下の関数を覚えておくと便利です:
max()
:最大値を計算するmin()
:最小値を計算するmean()
:平均値を計算するsd()
:標準偏差を計算するn()
:それぞれのグループごとのデータの数(行数)を数えるしかし、全体の平均や最小値だけでは役立ちません。
代わりに、国ごとの値が知りたい場合があります。
そのように「何かごと」に計算するには、グループ化を使用します。
group_by()
です:# A tibble: 1,704 × 6
# Groups: country [142]
country year pop continent life_exp gdp_percap
<chr> <dbl> <dbl> <chr> <dbl> <dbl>
1 Afghanistan 1952 8425333 Asia 28.8 779.
2 Afghanistan 1957 9240934 Asia 30.3 821.
3 Afghanistan 1962 10267083 Asia 32.0 853.
4 Afghanistan 1967 11537966 Asia 34.0 836.
5 Afghanistan 1972 13079460 Asia 36.1 740.
6 Afghanistan 1977 14880372 Asia 38.4 786.
7 Afghanistan 1982 12881816 Asia 39.9 978.
8 Afghanistan 1987 13867957 Asia 40.8 852.
9 Afghanistan 1992 16317921 Asia 41.7 649.
10 Afghanistan 1997 22227415 Asia 41.8 635.
# ℹ 1,694 more rows
これで国ごとのグループが作成されました
ただし、グループ化だけではまだ計算が行われていません。
グループ化の次にsummarize()
を用いて計算します:
# A tibble: 142 × 2
country mean_life_exp
<chr> <dbl>
1 Afghanistan 37.5
2 Albania 68.4
3 Algeria 59.0
4 Angola 37.9
5 Argentina 69.1
6 Australia 74.7
7 Austria 73.1
8 Bahrain 65.6
9 Bangladesh 49.8
10 Belgium 73.6
# ℹ 132 more rows
# A tibble: 142 × 3
country mean_life_exp sd_life_exp
<chr> <dbl> <dbl>
1 Afghanistan 37.5 5.10
2 Albania 68.4 6.32
3 Algeria 59.0 10.3
4 Angola 37.9 4.01
5 Argentina 69.1 4.19
6 Australia 74.7 4.15
# ℹ 136 more rows
sd()
(「standard deviation」)は標準偏差を計算する関数です。パイプとコマンドを組み合わせることで、複雑なデータ処理を簡単に行うことができます。
例えば、アジアの国だけに絞ってから、国ごとの計算も可能です:
gapminder |>
filter(continent == "Asia") |>
group_by(country) |>
summarize(
mean_life_exp = mean(life_exp),
sd_life_exp = sd(life_exp)
)
# A tibble: 33 × 3
country mean_life_exp sd_life_exp
<chr> <dbl> <dbl>
1 Afghanistan 37.5 5.10
2 Bahrain 65.6 8.57
3 Bangladesh 49.8 9.03
4 Cambodia 47.9 8.93
5 China 61.8 10.3
6 Hong Kong China 73.5 6.69
7 India 53.2 9.26
8 Indonesia 54.3 11.5
9 Iran 58.6 8.98
10 Iraq 56.6 5.74
# ℹ 23 more rows
group_by
でグループを定義summarize()
でグループごとの計算を実行|>
)で複数のデータ処理操作をつなぐことで、複雑なデータ処理パイプラインが構築できます。