{tidyverse} をロードする── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors・変数を手作りする方法を解説します
・変数をマージしてデータフレームの作り方を説明します
・複数のデータフレームをマージする方法を説明します
・様々な拡張子のデータを RStudio に取り込む方法を紹介します
・データ分析を行う前段階として、基礎的な専門用語の解説をします
テキストデータ、バイナリデータ、拡張子、パス、ファイル、フォルダ、Rプロジェクト、Rプロジェクトフォルダ、作業ディレクトリ、欠損値、変数の型、R付属データ、パイプ演算子、変数の型
(class)、AND演算子、OR演算子、%in%演算子、欠損値
data
というフォルダを作成hr96-24.csv ファイルを
data の中に入れる.csvファイルの読み取りには {tidyverse}
の中に含まれる read_csv()関数を使うarrange()hr を使って当選者の中で
(wl > 0) 獲得票数 (vote)
の少ない候補者を表示してみる# A tibble: 4,078 × 8
   pref    kun seito        j_name      wl gender  rank  vote
   <chr> <dbl> <chr>        <chr>    <dbl> <chr>  <dbl> <dbl>
 1 東京     22 社民         保坂展人     2 male       5 13904
 2 京都      3 日本維新の会 森夏枝       2 female     4 16511
 3 埼玉      6 社民         深田肇       2 male       4 17909
 4 埼玉      8 共産         塩川鉄也     2 male       4 18512
 5 奈良      1 民主         家西悟       2 male       4 18994
 6 沖縄      1 共産         赤嶺政賢     2 male       4 19528
 7 高知      3 共産         春名真章     2 male       3 19549
 8 京都      5 希望         井上一徳     2 male       4 19586
 9 徳島      1 維新         吉田知代     2 female     3 20065
10 沖縄      4 れい         山川仁       2 male       3 20284
# ℹ 4,068 more rows!is.na()NA か否かを判定するには is.na()
関数を使う# A tibble: 1,294 × 3
    year j_name       exp
   <dbl> <chr>      <dbl>
 1  1996 伊東マサコ    NA
 2  1996 山田浩        NA
 3  1996 浅野光雪      NA
 4  1996 石川和己      NA
 5  1996 村松陽一      NA
 6  1996 山崎義章      NA
 7  1996 中野庸子      NA
 8  1996 小川修        NA
 9  1996 阿閉正雄      NA
10  1996 伊東敬芳      NA
# ℹ 1,284 more rowsexp に NA が 2831 もあることがわかるN
と変数の数を確認する[1] 10773    22exp が 2831 も欠損であることがわかるexp の欠損値を除外したいのだから、否定を表す
! を使う# A tibble: 9,479 × 3
    year j_name          exp
   <dbl> <chr>         <dbl>
 1  1996 河村たかし  9828097
 2  1996 今枝敬雄    9311555
 3  1996 佐藤泰介    9231284
 4  1996 岩中美保子  2177203
 5  1996 青木宏之   12940178
 6  1996 田辺広雄   16512426
 7  1996 古川元久   11435567
 8  1996 石山淳一    2128510
 9  1996 藤原美智子  3270533
10  1996 吉田幸弘   11245219
# ℹ 9,469 more rowsexp が欠損していない 6829 行を抽出できたarrange()arrange() 関数を使うhr から当選者 (wl > 0)
の行のみを抽出しvote)
が少ない当選者を上から順に表示してみるhr |> 
  filter(wl > 0) |> 
  arrange(vote) |> 
  select(year, pref, kun, seito, j_name, wl, gender, rank, vote)# A tibble: 4,078 × 9
    year pref    kun seito        j_name      wl gender  rank  vote
   <dbl> <chr> <dbl> <chr>        <chr>    <dbl> <chr>  <dbl> <dbl>
 1  1996 東京     22 社民         保坂展人     2 male       5 13904
 2  2017 京都      3 日本維新の会 森夏枝       2 female     4 16511
 3  1996 埼玉      6 社民         深田肇       2 male       4 17909
 4  2003 埼玉      8 共産         塩川鉄也     2 male       4 18512
 5  1996 奈良      1 民主         家西悟       2 male       4 18994
 6  2003 沖縄      1 共産         赤嶺政賢     2 male       4 19528
 7  1996 高知      3 共産         春名真章     2 male       3 19549
 8  2017 京都      5 希望         井上一徳     2 male       4 19586
 9  2021 徳島      1 維新         吉田知代     2 female     3 20065
10  2024 沖縄      4 れい         山川仁       2 male       3 20284
# ℹ 4,068 more rowswl == 1 と指定するhr |> 
  filter(wl == 1) |> 
  arrange(vote) |> 
  select(year, pref, kun, seito, j_name, wl, gender, rank, vote)# A tibble: 2,963 × 9
    year pref     kun seito j_name        wl gender  rank  vote
   <dbl> <chr>  <dbl> <chr> <chr>      <dbl> <chr>  <dbl> <dbl>
 1  1996 高知       1 共産  山原健二郎     1 male       1 33523
 2  2000 高知       1 自民  福井照         1 male       1 40765
 3  2000 大阪      17 自民  岡下信子       1 female     1 41781
 4  1996 京都       2 自民  奥田幹生       1 male       1 43060
 5  2003 高知       1 自民  福井照         1 male       1 43232
 6  2012 高知       1 自民  福井照         1 male       1 44027
 7  2009 高知       1 自民  福井照         1 male       1 44068
 8  2024 栃木       3 自民  簗和生         1 male       1 45546
 9  2024 富山       1 自民  田畑裕明       1 male       1 45917
10  1996 神奈川     4 自民  飯島忠義       1 male       1 46389
# ℹ 2,953 more rowsarrange(desc())desc() 関数で囲む# A tibble: 10,773 × 9
    year pref     kun seito j_name        wl gender  rank   vote
   <dbl> <chr>  <dbl> <chr> <chr>      <dbl> <chr>  <dbl>  <dbl>
 1  2021 神奈川    15 自民  河野太郎       1 male       1 210515
 2  2009 北海道     9 民主  鳩山由紀夫     1 male       1 201461
 3  2009 静岡       6 民主  渡辺周         1 male       1 197688
 4  2005 神奈川    11 自民  小泉純一郎     1 male       1 197037
 5  2012 神奈川    15 自民  河野太郎       1 male       1 192604
 6  2009 埼玉       6 民主  大島敦         1 male       1 186993
 7  2005 神奈川    15 自民  河野太郎       1 male       1 186770
 8  2009 北海道     3 民主  荒井聰         1 male       1 186081
 9  2012 神奈川    11 自民  小泉進次郎     1 male       1 184360
10  2009 静岡       5 民主  細野豪志       1 male       1 184328
# ℹ 10,763 more rowsDT::datatable()
関数を使うと便利bind_rows()data.frame
を縦に結合する場合は、bind_rows() を使うdata.frame があるとするdf1 <- data.frame(id = 1:5,
                  name = c("A", "B", "C", "D", "E"),
                  score = c(100, 90, 80, 70, 60))
df2 <- data.frame(id = 6:8,
                  name = c("F", "G", "H"),
                  score = c(50, 40, 30))data.frame を表示させてみる  id name score
1  1    A   100
2  2    B    90
3  3    C    80
4  4    D    70
5  5    E    60  id name score
1  6    F    50
2  7    G    40
3  8    H    30data.frame は同じ変数名を共有しているbind_rows() 関数を使って、縦に積み重ねることが可能bind_rows()・・・rows (行を)
bind (結びつける)data.frame
の変数名が一致する必要ありid, name, score
は一致している  id name score
1  1    A   100
2  2    B    90
3  3    C    80
4  4    D    70
5  5    E    60
6  6    F    50
7  7    G    40
8  8    H    30list() 関数df1 と df2 がそれぞれ 1 年ゼミと 2
年ゼミの学生データだとするbind_rows()
を使って縦に結合すると、学生の学年が分からないlist() 関数を使ってまとめ.id 引数を追加する  学年 id name score
1  1年  1    A   100
2  1年  2    B    90
3  1年  3    C    80
4  1年  4    D    70
5  1年  5    E    60
6  2年  6    F    50
7  2年  7    G    40
8  2年  8    H    30data.frame
に共通する変数(下の例では univ)df1 <- data.frame(univ  = c("拓殖大学", "早稲田大学", "UCLA"),
                  city   = c("東京", "東京", "LA"),
                  pop  = c(8600, 47000, 45000))
df2 <- data.frame(univ  = c("拓殖大学", "早稲田大学", "UCLA"),
                  color  = c("オレンジ", "えんじ", "黄色と青"))left_join()right_join()inner_join()full_join()data.frame のオブジェクト名を入力by = "キー変数名"の引数を追加left_join() 関数のメカニズムleft_join(x, y) は x
を温存させる関数x・・・拓殖大学, 早稲田大学, UCLA
が含まれるy・・・拓殖大学, 早稲田大学, 東北大学
が含まれるx の UCLA と y
の東北大学はどうなるか?left_join(x, y) を使うと、x の UCLA
が優先されて残されるfounder は欠損値
(NA) と表示される
right_join() 関数のメカニズムright_join(x, y) は y
を温存させる関数x・・・拓殖大学, 早稲田大学, UCLA
が含まれるy・・・拓殖大学, 早稲田大学, 東北大学
が含まれるx の UCLA と y
の東北大学はどうなるか?right_join(x, y) を使うと、y
の東北大学が優先されて残されるpop は欠損値
(NA) と表示される
inner_join() 関数のメカニズムx・・・拓殖大学, 早稲田大学, UCLA
が含まれるy・・・拓殖大学, 早稲田大学, 東北大学
が含まれるinner_join(x, y) は x と y
両データに同時に存在する行のみが結合対象
x <- data.frame(pop  = c(8600, 47000, 45000),
                univ  = c("拓殖大学", "早稲田大学", "UCLA"))
y <- data.frame(univ  = c("拓殖大学", "早稲田大学", "東北大学"),
                  founder  = c("桂太郎", "大隈重信", "日本国"))    pop       univ  founder
1  8600   拓殖大学   桂太郎
2 47000 早稲田大学 大隈重信full_join() 関数のメカニズムx・・・拓殖大学, 早稲田大学, UCLA
が含まれるy・・・拓殖大学, 早稲田大学, 東北大学
が含まれるfull_join(x, y) は x と y
全てを温存させるNA) と表示される
x <- data.frame(pop  = c(8600, 47000, 45000),
                univ  = c("拓殖大学", "早稲田大学", "UCLA"))
y <- data.frame(univ  = c("拓殖大学", "早稲田大学", "東北大学"),
                  founder  = c("桂太郎", "大隈重信", "日本国"))    pop       univ  founder
1  8600   拓殖大学   桂太郎
2 47000 早稲田大学 大隈重信
3 45000       UCLA     <NA>
4    NA   東北大学   日本国tidy data 構造tidy data とはHadley Wickham
が提唱したデータ分析に適したデータ構造tidy data はパソコンにとって読みやすいデータR
における多くの分析は整然データを基づいて行われるtidyr
パッケージ・・・整然ではないデータ(=雑然データ)を整然データへ変形tidy data の 4 つの原則| 1. 1 つの「列」 | = 1 つの「変数」 | 
| 2. 1 つの「行」 | = 1 つの「観測」 | 
| 3. 1 つの「セル」 | = 1 つの「値」 | 
| 4. 1 つの「表」 | = 1 つの「分析単位」 | 
mos と mc という2
つの変数)に分かれていることmos,
mc)が入っているscore)」と「バーガーの種類
(burger)」を表す変数をそれぞれ作る必要があるscore)だけburger)だけmos, mc) が入っているscore) だけburger) だけave) の作成ここでやりたいこと 
・50人の生徒が履修している
・春学期にチェックテストを5回実施した
・生徒は全てのチェックテストを受験したとは限らない
・公平にチェックテストの点数を計算するにはどうすればいいのか
checktest.csv, (N=50)データの準備
checktest.csv{tidyverse} パッケージを読み込むchecktest.csv
をダウンロードする
期末試験のデータを読み込み df_checktest
と名前を付ける
na = "."
を指定し、欠損値を「.」で表示すると指定
df_checktest の中を確認してみるdf_check の記述統計を表示させる{r, results = "asis"}
と指定する| Statistic | N | Mean | St. Dev. | Min | Max | 
| test_1 | 43 | 80.256 | 11.146 | 60 | 100 | 
| test_2 | 46 | 77.804 | 11.268 | 55 | 100 | 
| test_3 | 42 | 80.357 | 8.647 | 60 | 100 | 
| test_4 | 44 | 78.182 | 10.308 | 50 | 100 | 
| test_5 | 43 | 80.721 | 9.407 | 55 | 100 | 
・それぞれのチェックテストには 4〜8
の欠損値 (NA) がある
rowwise() と na.rm = TRUE を加える→ 欠損値を考慮した平均値を計算できる
df_check1 <- df_check1 |> 
  rowwise() |> 
  mutate(ave = mean(c(test_1, test_2, test_3, test_4, test_5), 
    na.rm = TRUE))submission)
の作成df_check をロング型データ
df_check_long に変換する・df_check_long の
score に欠損値がある生徒を除外する
・学生ごとに (Student_1 〜
Student_50まで)チェックテストの「受験回数」を計算し表示させる
→ group_by() 関数を使って df_check_long の
name に現れた生徒の名前の数を計算する
→ これがチェックテストの「受験回数」
→ 「受験回数」を submission という変数に格納する
df_check2 + df_check_nosub =>
df_st_listname) を手がかりにマージするdf_st_list  |>  
  ggplot(aes(submission, ave)) +
  geom_point() +
  labs(x = "チェックテストの受験回数", y = "チェックテストの平均点",
         title = "チェックテストの受験回数と平均点の散布図") + 
  stat_smooth(method = lm) +  # (method = lm, se = FALSE) → 95% 信頼区間が消える
  geom_text(aes(y = ave + 0.2, 
                label = name), 
            size = 4, 
            vjust = 0)成績評価基準 
・期末試験(60%)
・宿題 (40%)
R01_exam_score.csv, (N=100)R01_hw.csv, (N=500)データの準備
R01_exam_score.csv{tidyverse} パッケージを読み込むR01_exam_score.csv
をダウンロードする
期末試験のデータを読み込み df_exam
と名前を付ける
na = "."
を指定し、欠損値を「.」で表示すると指定
df_exam の中を確認してみるdf_exam の記述統計を表示させる     name               score       
 Length:100         Min.   : 45.00  
 Class :character   1st Qu.: 68.00  
 Mode  :character   Median : 74.00  
                    Mean   : 75.23  
                    3rd Qu.: 84.00  
                    Max.   :100.00  
                    NA's   :9       score には 9 の欠損値 (NA)
を確認
期末試験結果の分布をヒストグラムで表示してみる
df_exam |> 
  filter(!is.na(score)) |> 
  ggplot() +
  geom_histogram(aes(x = score), color = "white", 
                 binwidth = 10, boundary = 0) +
  labs(x = "期末試験点数", y = "学生数") +
  geom_vline(xintercept = mean(df_exam$score, 
                               na.rm = TRUE), # score には欠損値が含まれるので、na.rm = TRUE を指定
             col = "magenta", # 平均値に真ジェンタ色の縦線を引く
    linetype = "dotted")   R01_hw.csvR01_df_hw.csv
をダウンロードするna = "."
を指定し、欠損値を「.」で表示すると指定df_hw の中を確認してみるN = 500df_exam は N = 100, df_hw
は N = 500
成績を付けるために必要なのは 100人分の成績データ
→ 観測数を N = 100 に統一する必要がある
学生ごとに
(Student_1 〜 Student_100まで)何回宿題を「提出」したかを計算し表示させる
→ group_by() 関数を使って df_hw の
name と hw
をグループ化し「提出」の合計を計算
→ 「提出」の合計値を submission
という変数に格納する
submission
には「提出」した回数ばかりでなく「未提出」の回数も表示されているfilter()
関数を使って、非表示にするhw も不要なので select()
関数を使って非表示にするdf_hw |> 
  filter(!is.na(submission)) |>  # 欠損値処理
  ggplot() +
  geom_histogram(aes(x = submission), color = "white", 
                 binwidth = 1, boundary = 0) +
  labs(x = "宿題の提出回数", y = "学生数") +
  geom_vline(xintercept = mean(df_hw$submission,
    na.rm = T), 
    col = "yellow",
    linetype = "dotted") # 平均値に黄色の縦線を引く summary()
関数を使って、正確な記述統計を表示してみる   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   3.000   4.000   3.652   4.000   5.000 df_exam と df_hw)を得た  left_join()right_join()inner_join()full_join()left_join()成績評価基準_1 
・期末試験(60%)
・宿題 (40%)
・期末試験を受けた人だけが採点対象
つまり「宿題を提出するしないに関わらず、期末試験を受験した人だけを採点する」
→ データフレームx (ここでは df_exam)
を温存させて結合する
→ left_join() 関数を使う
この場合、結合されるデータフレームは次のような構造になる
left_join() は x を温存する結合方法x に含まれる Student_1,
Student_2, Student_3 だけが温存されるy に含まれても x には含まれない
Student_4 は除外されるname がキー変数left_join() は x を優先した 100
人全員が結合対象score と
submission) は作れたscore は
100点満点換算の値だが、submission は 5 点満点の値
→ submission を 100点満点換算の値 (sub)
に変換する必要がある成績評価基準 
・期末試験(60%)
・宿題 (40%)
grade
が小数点表示になっているので、round()
関数を使って、小数点以下を四捨五入して非表示にするname と grade に絞るdf_left <- df_left |> 
  mutate(grade = score * 0.6 + sub * 0.4) |> 
  mutate(grade = round(grade, digits = 0)) |> 
  select(name, grade)これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
df_left |> 
  filter(!is.na(grade)) |> 
  ggplot() +
  geom_histogram(aes(x = grade), color = "white", 
                 binwidth = 10, boundary = 0) +
  labs(x = "最終成績", y = "学生数") +
  geom_vline(xintercept = mean(df_left$grade, 
    na.rm = T), 
    col = "yellow",
    linetype = "dotted")# 平均値に黄色の縦線を引く     Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  53.00   67.75   75.00   74.62   81.00  100.00      16 full_join()成績評価基準_2 
・期末試験(60%)
・宿題 (40%)
・宿題を 1
回も提出しなくても、期末試験で満点を取れば単位(=
60点)を認定する
つまり「宿題提出の有無や期末試験を受験したかどうかにかかわらず、全員を採点する」
→ 2 つのデータフレームに存在する全ての行が結合対象になる
→ full_join() 関数を使う
この場合、結合されるデータフレームは次のような構造になる
full_join() は x と y
両データに存在する全ての行が結合対象
x には Student_3
があるが、y には Student_3 がない時
→ Student_3 の score の値は残る
y には Student_4
があるが、x には Student_4 がない時
→ Student_4 の submission の値は残る
df_exam と df_hw
は問題なく結合できる
Student_1 から Student_100
まで全員が結合できる
→ ここでは name がキー変数
score と
submission) は作れたscore は
100点満点換算の値だが、submission は 5 点満点の値submission を 100点満点換算の値 (sub)
に変換する必要があるdf_full <- df_full |> 
  mutate(sub = submission * 100/5) |> 
  select(name, score, sub) # submission  を非表示にする      name               score             sub        
 Length:100         Min.   : 45.00   Min.   : 20.00  
 Class :character   1st Qu.: 68.00   1st Qu.: 60.00  
 Mode  :character   Median : 74.00   Median : 80.00  
                    Mean   : 75.23   Mean   : 73.04  
                    3rd Qu.: 84.00   3rd Qu.: 80.00  
                    Max.   :100.00   Max.   :100.00  
                    NA's   :9        NA's   :8       NA's = 9)NA's = 8)成績評価基準 
・期末試験(60%)
・宿題 (40%)
grade
が小数点表示になっているので、round()
関数を使って、小数点以下を四捨五入して非表示にするname と grade に絞るdf_full <- df_full |> 
  mutate(grade = score * 0.6 + sub * 0.4) |> 
  mutate(grade = round(grade, digits = 0)) |> 
  select(name, score, sub,grade)これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
df_full |> 
  filter(!is.na(grade)) |> 
  ggplot() +
  geom_histogram(aes(x = grade), color = "white", 
                 binwidth = 10, boundary = 0) +
  labs(x = "最終成績", y = "学生数") +
  geom_vline(xintercept = mean(df_full$grade,
    na.rm = T), 
    col = "yellow",
    linetype = "dotted")# 平均値に黄色の縦線を引く      Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  53.00   67.75   75.00   74.62   81.00  100.00      16 Student_8 は宿題は 1 度も提出しなかったが、期末で
97点を取得97 x 0.6 = 58点
なので単位認定はできないinner_join()成績評価基準_3 
・期末試験(60%)
・宿題 (40%)
・「宿題を 1
回も提出しない人」もしくは「期末試験を受験しない人」は採点されない
つまり「宿題を最低 1
回提出し、かつ期末試験を受験した人だけを採点する」
→ どちらのデータフレームにも存在する行のみが結合対象になる
→ inner_join() 関数を使う
この場合、結合されるデータフレームは次のような構造になる
inner_join() は x と y
両データに共通して存在する行が結合対象x には Student_3 があるが、y
には Student_3 がない時Student_3 は残らないy には Student_4 があるが、x
には Student_4 がない時Student_4 は残らないdf_exam と df_hw
は問題なく結合できるStudent_1 から Student_100
まで全員が結合できるとは限らない→ ここでは name がキー変数
inner_join() は x と y
両データに同時に共通して存在する 92 人だけが結合対象score と
submission) は作れたscore は
100点満点換算の値だが、submission は 5 点満点の値submission を 100点満点換算の値 (sub)
に変換する必要があるdf_final <- df_final |> 
  mutate(sub = submission * 100/5) |> 
  select(name, score, sub) # submission  を非表示にする  成績評価基準_3 
・期末試験(60%)
・宿題 (40%)
・「宿題を 1
回も提出しない人」もしくは「期末試験を受験しない人」は採点されない
grade
が小数点表示になっているので、round()
関数を使って、小数点以下を四捨五入して非表示にするname と grade に絞るdf_final <- df_final |> 
  mutate(grade = score * 0.6 + sub * 0.4) |> 
  mutate(grade = round(grade, digits = 0)) |> 
  select(name, grade)これで、最終的な成績が計算できた
学生の最終成績の分布をヒストグラムで表示してみる
df_final |> 
  filter(!is.na(grade)) |> 
  ggplot() +
  geom_histogram(aes(x = grade), color = "white", 
                 binwidth = 10, boundary = 0) +
  labs(x = "最終成績", y = "学生数") +
  geom_vline(xintercept = mean(df_final$grade,
    na.rm = T), 
    col = "yellow",
    linetype = "dotted") # 平均値に黄色の縦線を引く    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
  53.00   67.75   75.00   74.62   81.00  100.00       8 tidyr パッケージを使ったデータの変換は次の 3
種類ある| pivot_longer() | Wide型(雑然) → Long型(整然) | |
| pivot_wider() | long型(整然) → wide型(雑然) | |
| separate() | セルの分割 | 例:「年月日」→「年」「月」「日」 | 
pivot_longer()データの準備
(mos_mc_paired.csv)  ・ mos_mc_paired.csv
をクリックしてデータをパソコンにダウンロード   ・RProject
フォルダ内に data という名称のフォルダを作成する
・ダウンロードした mos_mc.csv を手動でRProject
フォルダ内にある data フォルダに入れる
・選挙データの読み取る
wide format)」なので、R 上では分析しにくい→ pivot_longer() 関数を使って「ロング形式
(long  format)」に変換する
pivot_longer() 関数 
データ |>
  pivot_longer(cols = 変数が格納されている列,
  names_to          = "元の列名が入る変数名",
  values_to         = "変数の値が入る変数名")
df_long <- df_mosmc |>  
    pivot_longer(cols      = mos:mc,
                 names_to  = "burger", # バーガー店名を入力  
                 values_to = "score") # バーガーの評価点を入力  pivot_wider()long 型データを wide
型データへ整形する際は pivot_wider() を使うwide 型データが多いpivot_wider() 関数を使って「ロング形式
(wide  format)」に変換するpivot_wider() 関数 
データ |>
  pivot_wider(cols = 変数が格納されている列,
  names_from          = "元の列名が入る変数名",
  values_from         = "変数の値が入る変数名")
df_wide <- df_long |> 
  pivot_wider(names_from  = "burger", # バーガー店名を入力 
              values_from = "score") # バーガーの評価点を入力  separate()データの準備:
COVID19_Worldwide.csv 
| 変数名 | 詳細 | 
|---|---|
| ID | ID | 
| Country | 国名 | 
| Date | 年月日 | 
| Confirmed_Day | COVID-19 新規感染者数(人)/ 一日あたり | 
| Confirmed_Total | COVID-19 累積感染者数(人)総合 | 
| Death_Day | COVID-19 新規死亡者数(人) 一日あたり | 
| Death_Total | COVID-19 累積死亡者数(人)総合 | 
| Test_Day | COVID-19 新規検査数(人) 一日あたり | 
| Test_Total | COVID-19 累積検査数(人)総合 | 
covid_df <- read_csv("data/COVID19_Worldwide.csv", 
                       guess_max = 10000) 
                      # 最初の10000行を読んでからデータ型を判断するよう設定[1] "ID"              "Country"         "Date"            "Confirmed_Day"  
[5] "Confirmed_Total" "Death_Day"       "Death_Total"     "Test_Day"       
[9] "Test_Total"     | 変数名 | 詳細 | 
|---|---|
| Country | 国名 | 
| Date | 年月日 | 
| Confirmed_Total | COVID-19 累積感染者数(人)総合 | 
| Death_Total | COVID-19 累積死亡者数(人)総合 | 
DT
パッケージを使って表示するdf1 は tidy data の 4
つの原則を満たす| 1. 1 つの「列」 | = 1 つの「変数」 | 
| 2. 1 つの「行」 | = 1 つの「観測」 | 
| 3. 1 つの「セル」 | = 1 つの「値」 | 
| 4. 1 つの「表」 | = 1 つの「分析単位」 | 
→ このデータは tidy data (=long型)
→ データを変換する必要はない
covid_df の変数の記述統計を表示させる{r, results = "asis"}
と指定する| Statistic | N | Mean | St. Dev. | Min | Max | 
| Confirmed_Total | 31,806 | 18,250.14 | 115,471.60 | 0 | 3,184,582 | 
| Death_Total | 31,806 | 1,039.01 | 6,565.51 | 0 | 134,094 | 
separate() 関数の使い方を解説するData) は 2020/1/22
と表示されているYYYY年MM月DD日」では不都合covid_df の separate() 列を
Year、Month、Day
に分けてみるseparate()関数の使い方 
データ |>
  separate(col  = "分割する変数名",
  into = c("分割後の変数名 1", "分割後の変数名 2", "分割後の変数名 3", ...),
  sep  = "分割する基準")   
"2020/1/22"
の場合、"2020"、"1"、"22" が
"/" という「基準」によって分割されているdeath_country <- df1 |> 
  group_by(Country, Year) |> 
  summarise(Death = sum(Death_Total),
            Infected = sum(Confirmed_Total))death_country の変数の記述統計を表示させる
チャンクオプションで {r, results = "asis"}
と指定する
| Statistic | N | Mean | St. Dev. | Min | Max | 
| Death | 186 | 177,670.60 | 782,130.30 | 0 | 8,616,010 | 
| Infected | 186 | 3,120,774.00 | 13,105,502.00 | 731 | 160,231,690 | 
Covid19
の累積感染者数と累積死者数の散布図を描いてみるplot_1 <- death_country |>  
  ggplot(aes(Infected, Death)) +
  geom_point() +
  stat_smooth(method = lm) +
  ggrepel::geom_text_repel(aes(label = Country),
            size = 3, 
            family = "HiraKakuPro-W3") +
  labs(x = "Covid19累積感染者数", y = "累積死者数")+
  theme_bw(base_family = "HiraKakuProN-W3")
plot_1plot_2 <- death_country |>  
  filter(Country != "United States") |> 
  ggplot(aes(Infected, Death)) +
  geom_point() +
  stat_smooth(method = lm) +
  ggrepel::geom_text_repel(aes(label = Country),
            size = 3, 
            family = "HiraKakuPro-W3") +
  labs(x = "Covid19累積感染者数", y = "累積死者数")+
  theme_bw(base_family = "HiraKakuProN-W3")
plot_2str_c()データの準備: hr96-24.csv
hr には 22 個の変数が入っている| 変数名 | 詳細 | 
|---|---|
| year | 選挙年 (1996-2021) | 
| pref | 都道府県名 | 
| ku | 小選挙区名 | 
| kun | 小選挙区 | 
| rank | 当選順位 | 
| wl | 選挙の当落: 1 = 小選挙区当選、2 = 復活当選、0 = 落選 | 
| nocand | 立候補者数 | 
| seito | 候補者の所属政党 | 
| j_name | 候補者の氏名(日本語) | 
| name | 候補者の氏名(ローマ字) | 
| previous | これまでの当選回数(当該総選挙結果は含まない) | 
| gender | 立候補者の性別: “male”, “female” | 
| age | 立候補者の年齢 | 
| exp | 立候補者が使った選挙費用(総務省届け出) | 
| status | 候補者のステータス: 0 = 非現職、1 現職、2 = 元職 | 
| vote | 得票数 | 
| voteshare | 得票率 (%) | 
| eligible | 小選挙区の有権者数 | 
| turnout | 小選挙区の投票率 (%) | 
| seshu_dummy | 世襲候補者ダミー: 1 = 世襲、0 = 非世襲(地盤世襲 or 非世襲) | 
| jiban_seshu | 地盤の受け継ぎ元の政治家の氏名と関係 | 
| nojiban_seshu | 世襲元の政治家の氏名と関係 | 
 [1] "year"          "pref"          "ku"            "kun"          
 [5] "wl"            "rank"          "nocand"        "seito"        
 [9] "j_name"        "gender"        "name"          "previous"     
[13] "age"           "exp"           "status"        "vote"         
[17] "voteshare"     "eligible"      "turnout"       "seshu_dummy"  
[21] "jiban_seshu"   "nojiban_seshu"| 変数名 | 詳細 | 
|---|---|
| year | 選挙年 (1996-2017) | 
| ku | 小選挙区名 | 
| kun | 小選挙区 | 
| j_name | 候補者の氏名(日本語) | 
DT
パッケージを使って表示するstr_c() 関数の使い方を解説するku) は
tokyo、小選挙区 (kun) は 1
のように表示されているtokyo_1 のように表示したいとするstr_c()関数の使い方 
データ |>
str_c(新たに作る変数名 = str_c(1番目の変数名, 2番目の変数名, sep = "間に入れる記号")
  
「6. 列の結合の実例」を参考にして「チェックテストの受験回数と平均点の散布図」を描き、A4一枚の用紙に印刷し、提出しなさいchecktest_ex.csvここでやりたいこと 
・50人の生徒が履修している
・春学期にチェックテストを5回実施した
・生徒は全てのチェックテストを受験したとは限らない(つまり、欠損値がある)
・公平にチェックテストの点数を計算するにはどうすればいいのか考慮して(つまり、欠損値を考慮して)「チェックテストの受験回数と平均点の散布図」を描く
・その際、「チェックテストの受験回数と平均点の散布図」にはどのような関係(傾向)があるか述べなさい
「5. {tidyverse}」を参考にし、衆院選データhr96-21-csv
を使って、次の問題にこたえなさい  Q1:
2024年総選挙において政権与党(自民党と公明党)の女性議員で小選挙区で当選した候補者一覧を表示させなさい
・一覧表には「選挙年」「選挙区」「政党」「氏名」「年齢」を含めなさい
Q2:
2024年総選挙において政権与党(自民党と公明党)の女性議員で小選挙区で当選した候補者の平均年齢を計算しなさい
Q3:
2024年総選挙において立憲民主党の女性議員で小選挙区で当選した候補者一覧を表示させなさい
・一覧表には「選挙年」「選挙区」「政党」「氏名」「年齢」を含めなさい
Q4:
2024年総選挙において立憲民主党の女性議員で小選挙区で当選した候補者の平均年齢を計算しなさい