ソフトウェア
カーペントリー

千葉大学 2024-11-25 ~ 26

https://swcarpentry-ja.github.io/2024-11-25-chiba-slides/

コラボレイティブ・ノート

Etherpadリンクとコードを貼っておきます。

  • 様々なリンクがあるので、今のうちにご自身のブラウザで開いてください。

アウトライン

  • スタッフの自己紹介
  • ソフトウェアカーペントリーの紹介
  • ワークショップの流れ
  • アイスブレーカー

スタッフの自己紹介

ニッタ ジョエル
(インストラクター)

@joelnitta

  • 千葉大学 国際学術研究院 准教授

  • 研究テーマ:シダ植物の進化、生態学、ゲノム解析

  • 趣味:ジョギング

西田 孝三(インストラクター)

  • パートタイマー

  • 東京農工大学 理化学研究所 等

  • 研究テーマ:パスウェイ-オミクスデータ マッピング・可視化

  • 趣味:オープンサイエンスコミュニティに貢献すること

岡 昂輝(ヘルパー)

@takakioka

  • 東京農工大学 工学府 生命工学専攻 修士課程

  • 研究テーマ: 大規模コホートデータを用いたアルツハイマー病態進行予測に資する代謝物バイオマーカーの探索

  • 趣味: ドライブ

露崎 弘毅(ヘルパー)

@kokitsuyuzaki

  • 千葉大学 医学研究院 人工知能(AI)医学 特任講師

  • 研究テーマ: パッケージング、(シングルセル)オミックス解析

  • 趣味: サーフィン、パン作り

行動規範

どなたでも気兼ねなくワークショップに参加できるように、行動規範があります。

行動規範に反する行為があった場合は、インシデントレポートフォームで報告することができます。

JSBiについて

準備

ソフトウェアカーペントリーの紹介

問題

  • 研究者は近年、コードを使うことが必要不可欠になっています。

  • 多くの研究者は独学でコードを学びます。

  • しかし、効率があまり良くありません。

drawing

ソフトウェアカーペントリー(SWC)の解決法

  • 研究者がコミュニティを作り、互いに教え合います。

  • 2日間にわたるワークショップで、3〜4つのレッスンを学びます。

https://software-carpentry.org/

drawing

ワークショップ

  • 誰でも参加可能

  • 無料または少額で提供

  • ワークショップの指導には資格が必要です。

  • 改善のためのフィードバックを重視します。

世界各国で実施

日本ではまだ始まったばかり

  • 今回が第2回目の対面日本語ワークショップです。
    • 今後も増やしていく予定です。
  • 翻訳活動も行っています。

参加者大募集中!

ワークショップの流れ

内容

上記のリンクからレッスンの内容にアクセスできます
(ChatGPTによる翻訳が含まれています)

SWCワークショップの流れ

  • 軽いスライドによる内容の説明

  • ライブコーディング

ライブコーディングとは?

  • インストラクターが入力するコードを、同時に自分のパソコンで入力します。

  • コードを理解することを最優先してください
    (メモを取るよりも)。

ライブコーディングとは?

  • インストラクターは参加者の理解を確認します
    (例:「〜ができましたか?」)

  • 理解できている場合は緑の付箋をラップトップに貼ってください。

  • 困ったことがある場合は赤い付箋をラップトップに貼ってください。

    • ヘルパーが助けに行きます。



インストラクターが聞かなくても、何か問題があった時は声をかけてください(または赤い付箋を貼ってください)。

コラボレイティブ・ノート

Etherpadにコードを貼っておきます。

  • インストラクターが進みすぎてコードが見えなくなった場合は、Etherpadのメモを参照してください。
    • 参加者も自由に書き込んでください。

フィードバックの種類

  • 感想(1日の終わりに付箋に記入していただきます)

  • ワークショップ前後のアンケート

アイスブレーカー

隣の方に自己紹介をしましょう

  • 研究テーマは何ですか?

  • 趣味は何ですか?

Unixシェル

データの準備

  • shell-lesson-data.zipをダウンロードして、デスクトップに移動してください。

  • ファイルを解凍します。デスクトップにshell-lesson-dataという新しいフォルダが作成されているはずです。

人間とコンピュータの相互作用

  • 人間はGUI(グラフィカルユーザインターフェース)またはCLI(コマンドラインインターフェース)を使ってコンピュータと対話します。

  • GUI: 視覚的で直感的な操作が可能ですが、反復作業には効率的ではありません。

  • CLI(Unixシェル): 反復作業に効率的で、タスクを迅速に自動化できます

  • シェルはユーザーが入力したコマンドを解釈し、実行します。

  • よく使われるUnixシェル: BashBourne Again SHell)。

  • シェルを使う利点:

    • 反復作業を自動化
    • パイプラインを活用した効率的なデータ処理
    • リモートマシンの操作や高性能コンピューティングに不可欠
  • 今日はコマンドを使ってシェルと対話する方法を学びます。

Nelleのパイプライン

  • サンプルデータセットは”Nelle Nemo”のストーリーに基づいています。

  • Nelle Nemoは海洋生物学者で、海洋生物をサンプリングしています。

  • Nelleのタスク: goostats.shを使って1520のサンプルのタンパク質量を測定します。

  • 課題: GUIを使用すると、Nelleは1520のファイルを手動で実行する必要があり、12時間以上かかります。シェルを使えば、これをより効率的に行うことができるでしょうか?

チャレンジ: ls

pwd/Users/backupを表示し、-rlsに逆順で表示するよう指示する場合、次の出力を得るにはどのコマンドを使用しますか:

pnas_sub/ pnas_final/ original/
  1. ls pwd
  2. ls -r -F
  3. ls -r -F /Users/backup

チャレンジ: 相対パス

pwd/Users/thingを表示している場合、ls -F ../backupは何を表示しますか?

  1. ../backup: No such file or directory
  2. 2012-12-01 2013-01-08 2013-01-27
  3. 2012-12-01/ 2013-01-08/ 2013-01-27/
  4. original/ pnas_final/ pnas_sub/

チャレンジ: ファイルの移動

以下のコマンドシーケンスで、最後のlsコマンドの出力はどうなりますか?

$ pwd
/Users/jamie/data
$ ls
proteins.dat
$ mkdir recombined
$ mv proteins.dat recombined/
$ cp recombined/proteins.dat ../proteins-saved.dat
$ ls
  1. proteins-saved.dat recombined

  2. recombined

  3. proteins.dat recombined

  4. proteins-saved.dat

チャレンジ: ファイルの整理

Jamieはプロジェクトに取り組んでいますが、ファイルがあまり整理されていないことに気づきました:

$ ls -F
analyzed/  fructose.dat    raw/   sucrose.dat

fructose.datsucrose.datのファイルはデータ解析の出力を含んでいます。 以下のコマンドが示す出力を得るために、Jamieはどのコマンドを実行する必要がありますか?

$ ls -F
analyzed/   raw/
$ ls analyzed
fructose.dat    sucrose.dat

Git

なぜGitを使うのか?

  • Gitとは、ファイル(コード)を追跡するソフトです。
  • MS Wordの「変更履歴の追跡」機能に似ています。
  • コードが「壊れた」時に巻き戻せます。
  • コードの共有や共同作業を簡単にします。

ストーリー

ステージング・エリア

ステージング・エリア

チャレンジ: コミットメッセージを決める

以下のコミットメッセージの内、最後の mars.txt のコミットに最適なメッセージはどれでしょう?

  1. “Changes”
  2. “Added line ‘But the Mummy will appreciate the lack of humidity’ to mars.txt”
  3. “Discuss effects of Mars’ climate on the Mummy”

チャレンジ: bio リポジトリ

  • bio という Git リポジトリ新しく作りましょう。
  • me.txt というファイルに自分について3文書いて、変更点をコミットしてください。
  • すでに書いた文章の内、ひとつだけ編集して、更にもう一文加えてください。
  • 編集した後の状態とその前の違いを表示してください。

チャレンジ: 変更点をコミットする

以下の内、myfile.txt を Git リポジトリに保存するためのコマンドはどれでしょう?

  1.    $ git commit -m "my recent changes"
  2.    $ git init myfile.txt
       $ git commit -m "my recent changes"
  3.    $ git add myfile.txt
       $ git commit -m "my recent changes"
  4.    $ git commit -m myfile.txt "my recent changes"

HEAD~1の意味

チャレンジ: ファイルの復元

ジェニファーは、数週間取り組んできたPythonスクリプトに変更を加えました。そして今朝行った変更により、スクリプトが “壊れ”、動作しなくなりました。 彼女はそれを修正しようとして約1時間費やしましたが、うまく機能しません…

幸い、彼女はGitを使用してプロジェクトのバージョンを追跡していました! 以下のどのコマンドで、data_cruncher.py と呼ばれるPythonスクリプトの最後にコミットされたバージョンを復元できるでしょうか?

  1. $ git restore

  2. $ git restore data_cruncher.py

  3. $ git restore -s HEAD~1 data_cruncher.py

  4. $ git restore -s <最後のコミットのID> data_cruncher.py

  5. 2番と4番の両方

チャレンジ:埋もれたファイルを無視する

以下のようなディレクトリ構造があるとします:

results/data
results/plots

results/dataではなく、results/plotsのみを無視するにはどうすればよいでしょう?

チャレンジ: ログファイル

仮に log_01log_02log_03といった中間ログファイルを作成するスクリプトを書いたとします。 これらのログファイルは保存しておきたいものの、gitで追跡したくありません。

  1. log_01log_02などのファイルを無視するためのルールを1つだけ.gitignoreに記入してください。
  2. 入力したパターンが正常に動作するか確認するために、log_01などのファイルを作成してください。
  3. 最終的にlog_01ファイルが重要であると判明しました。.gitignoreを編集せずにこのファイルを追跡対象に加えてください。
  4. 隣の人と、「追跡したくないファイルにはどのようなものがあるか」「.gitignoreにどのように記述するか」を話し合ってください。

認証の設定

  • リモートリポジトリに接続する前に、自分のコンピュータをGitHubに認証する方法を設定する必要があります。

  • これにより、GitHubはあなたのコンピュータからのアクセスを信頼します。

SSH プロトコルとは?

  • コマンドラインでアクセスを認証する一般的な方法を設定します。

  • この方法は「Secure Shell Protocol(SSH)」と呼ばれます。

  • SSHは、暗号化されたネットワークプロトコルで、通常は安全でないネットワークを介して安全な通信を可能にします。

SSH 鍵ペアの仕組み

  • SSHは「鍵ペア」を使います。
  • 鍵ペアはアクセスを検証するために協働して動作する2つの鍵です。
  • 一方は公開鍵(public key)、もう一方は秘密鍵(private key)と呼ばれます。

公開鍵と秘密鍵の例え

  • 公開鍵を南京錠に例えます。
  • 秘密鍵はその南京錠を開ける鍵です。
  • 公開鍵をGitHubアカウントに設定し、「この南京錠で通信をロックしてください」とします。
  • これにより、秘密鍵を持つコンピュータだけが通信を解読し、GitコマンドをGitHubアカウントとして送信できます。

リモートリポジトリに変更をプッシュする

チャレンジ:GitHub の GUI

GitHub の planets リポジトリに移動してください。

「Code」ボタンの下にある「XX commits」というテキストを見つけてクリックします(「XX」は数字です)。各コミットの右側にある3つのボタンにカーソルを合わせてクリックします。

  • これらのボタンからどのような情報を収集・探索できますか?

  • シェルで同じ情報を得るにはどうしますか?

共同作業

GitHub を使った共同作業をしてみましょう

  • 今回の課題は、ペアを組んで行います。

  • 一人は「オーナー」、もう一人は「コラボレーター」を担当します。

  • コラボレーターの目標は、オーナーのリポジトリに変更を加えることです。

  • 最後に役割を交代し、両方の人がオーナーとコラボレーターの役割を経験します。

コラボレーターにアクセス権限を与える

  • GitHub のリポジトリページで「Settings」ボタンをクリックします。
  • 「Collaborators」を選択します。
  • 「Add people」をクリックし、パートナーのユーザー名を入力します。

コラボレーターがオーナーのリポジトリへのアクセスを受け入れる

  • https://github.com/notifications にアクセスするか、メール通知を確認してください。
  • オーナーのリポジトリへのアクセスを承認します。

オーナーのリポジトリをクローンする

  • コラボレーターはオーナーのリポジトリのコピーを自分のマシンにダウンロードします(クローンする)。

  • 自分の planets.git バージョンを上書きしないよう、オーナーのリポジトリを別の場所にクローンしてください。

オーナーのリポジトリをクローンする

デスクトップフォルダにクローンする場合:

$ git clone git@github.com:vlad/planets.git ~/Desktop/vlad-planets

vlad をオーナーのユーザー名に置き換えてください。

クローンパス(~/Desktop/vlad-planets)を指定しない場合、自分の planets フォルダ内にクローンされるので、最初にデスクトップフォルダに移動してください。

クローンしたリポジトリに変更を加える

  • コラボレーターは、オーナーのリポジトリのクローンに変更を加えます。例えば:
cd ~/Desktop/vlad-planets
nano pluto.txt
git add pluto.txt
git commit -m "Add notes about Pluto"

変更を加えたファイルをリモートに送る(プッシュ)

git push origin main

オーナーのリポジトリを確認

  • オーナーのリポジトリを再確認し、コラボレーターが行った新しいコミットを確認します。

  • ブラウザを更新する必要がある場合もあります。

オーナーのローカルリポジトリの更新

  • オーナーが以下を実行します:
git pull origin main
  • これで、3つのリポジトリ(オーナーのローカル、オーナーのリモート、コラボレーターのリポジトリ)が同期されます。

もう一回やってみましょう

  • 今度は役割を交代して、もう一度試してみましょう。

チャレンジ:変更のレビュー

オーナーがコラボレーターに情報を提供せずにリポジトリにコミットをプッシュしました。

  • コマンドラインでは、コラボレーターは何が変更されたかをどのように確認できますか?

  • GitHub ではどのように確認できますか?

ソフトウェア
カーペントリー 二日目

千葉大学 2024-11-26

https://swcarpentry-ja.github.io/2024-11-25-chiba-slides/

コラボレイティブ・ノート

Etherpadリンクとコードを貼っておきます。

  • 様々なリンクがあるので、今のうちにご自身のブラウザで開いてください。

1日目のおさらい

  • シェルは研究に必要不可欠なスキルです。
    • オープンソースソフトウェアの活用
    • サーバーの操作
    • git の使用にも必須
  • git はコードの細かな変更を追跡し共有を可能にします。

フィードバック:よくできたこと

  • 「ふせんのおかげで質問や意思表示がしやすかった」

  • 「よくわからないことがあった時にすぐにサポートに来ていただいて大変助かりました」

  • 「トラブルが起きても言いやすい環境だったのが良かった」

フィードバック:改善できるところ

  • ホワイトボードの文字(図)が見づらい濃いペンを使います!大きく書きます!

  • 画面の文字が少し小さい大きくしました

  • ユーザー名やディレクトリ名が色分けされるようなターミナルを用いてくれると嬉しいターミナルの設定を変えました

  • 「何のためにどうしてコマンドを行うのか、何に使うことができるのか、説明があると嬉しかったです」背景の説明を増やします

git におけるコンフリクトの解決

質問

  • 自分の変更が他の人の変更とコンフリクトする場合はどうすればいいですか?

目的

  • コンフリクトとは何か、いつ発生する可能性があるかを説明します。
  • マージによって生じる競合を解決します。

コンフリクトのイメージ

コンフリクトを作る (コラボレーターが編集)

コラボレーターの方にだけ 1 行追加してみましょう。

$ nano mars.txt
$ cat mars.txt
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
This line added to Wolfman's copy

コンフリクトを作る (コラボレーターがコミット)

コラボレーターの方で変更をコミットします。

$ git add mars.txt
$ git commit -m "Add a line in our home copy"
[main 5ae9631] Add a line in our home copy
 1 file changed, 1 insertion(+)

コンフリクトを作る (コラボレーターがプッシュ)

コラボレーターの方でコミットを GitHub にプッシュします。

$ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 331 bytes | 331.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/vlad/planets.git
   29aba7c..dabb4c8  main -> main

コンフリクトを作る (オーナーが編集)

オーナーが GitHub から pull せずに、自分のコピーに「別の」変更を加えてもらいます。

$ nano mars.txt
$ cat mars.txt
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
We added a different line in the other copy

コンフリクトを作る (オーナーがコミット)

オーナーは変更をローカルにコミットできます:

$ git add mars.txt
$ git commit -m "Add a line in my copy"
[main 07ebc69] Add a line in my copy
 1 file changed, 1 insertion(+)

コンフリクトを作る (オーナーがプッシュ「できない」)

しかし、オーナーは Git で GitHub にプッシュできません。

$ git push origin main
To https://github.com/vlad/planets.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/vlad/planets.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

コンフリクトのイメージ

Git は、リモート リポジトリにローカル ブランチに組み込まれていない新しい更新があることを検出したため、プッシュを拒否しました。

コンフリクトの解決 (オーナーが git pull する)

必要なのは、GitHub から変更を pull し、現在作業中のコピーにマージしてからプッシュすることです。 まずは pull から始めましょう:

$ git pull origin main
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/vlad/planets
 * branch            main     -> FETCH_HEAD
    29aba7c..dabb4c8  main     -> origin/main
Auto-merging mars.txt
CONFLICT (content): Merge conflict in mars.txt
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトの解決 (拒否されたマージの結果)

git pullコマンドは、ローカル リポジトリを更新して、リモート リポジトリにすでに含まれている変更を組み込みます。 リモート ブランチからの変更が取得された後、Git はローカル コピーに加えられた変更がリモート リポジトリに加えられた変更と重複していることを検出し、 以前の作業が損なわれないように 2 つのバージョンのマージを拒否します。 コンフリクトは、影響を受けるファイルで下記のようにマークされます。

$ cat mars.txt
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
<<<<<<< HEAD
We added a different line in the other copy
=======
This line added to Wolfman's copy
>>>>>>> dabb4c8c450e8475aee9b14b4383acc99f42af1d

コンフリクトの解決 (マーカーを削除し、変更を調整する)

このファイルを編集して、これらのマーカーを削除し、変更を調整するのは私たちの仕事です。 ローカル リポジトリでの変更を維持するか、リモート リポジトリでの変更を維持するか、両方を置き換える新しいものを書き込むか、変更を完全に削除するか、何でも好きなように行うことができます。 両方を置き換えて、ファイルを次のようにしてみましょう。

Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
We removed the conflict on this line

コンフリクトの解決 (マージを完了するために変更をコミットする)

$ git add mars.txt
$ git status
On branch main
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   mars.txt
$ git commit -m "Merge changes from GitHub"
[main 2abf2b1] Merge changes from GitHub

コンフリクトの解決 (ついに push してコンフリクトを解決)

$ git push origin main
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 645 bytes | 645.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), completed with 2 local objects.
To https://github.com/vlad/planets.git
   dabb4c8..2abf2b1  main -> main

コンフリクトの解決 (今度はコラボレーターが pull する)

Git は何を何とマージしたかを追跡しているので、最初の変更を行ったコラボレーターが pull したときに、再度手作業で修正する必要がありません。 今度はコラボレーターが pull してください

$ git pull origin main
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 4), reused 6 (delta 4), pack-reused 0
Unpacking objects: 100% (6/6), done.
From https://github.com/vlad/planets
 * branch            main     -> FETCH_HEAD
    dabb4c8..2abf2b1  main     -> origin/main
Updating dabb4c8..2abf2b1
Fast-forward
 mars.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

コンフリクトの解決 (コラボレーターがオーナーにマージされた内容を確認)

コラボレーターはオーナーにマージされた内容を確認してみましょう

$ cat mars.txt
Cold and dry, but everything is my favorite color
The two moons may be a problem for Wolfman
But the Mummy will appreciate the lack of humidity
We removed the conflict on this line

コンフリクトの解決のまとめ

  • 2 人以上の人が同じファイルの同じ行を変更すると、競合が発生します。
  • バージョン管理システムでは、ユーザーが互いの変更を盲目的に上書きすることは許可されませんが、競合が強調表示されるので、解決できます。

R と RStudio

質問

  • RStudio内でどのように操作するのか?
  • Rとの対話方法は?
  • 環境をどのように管理するのか?
  • パッケージをどのようにインストールするのか?

目的

  • RStudioの各ペインの目的と使用方法を説明する
  • RStudio内のボタンやオプションの場所を見つける
  • 変数を定義する
  • データを変数に代入する
  • インタラクティブなRセッションでワークスペースを管理する
  • 数学および比較演算子を使用する
  • パッケージを管理する

チャレンジ:変数名

次の中で有効なRの変数名はどれですか?

  • min_height
  • max.height
  • _age
  • .mass
  • MaxLength
  • min-length
  • 2widths
  • celsius2kelvin

チャレンジ:変数の比較と削除

  • 次のプログラムの各文の後で、各変数の値はどうなるでしょうか?
mass <- 47.5
age <- 122
mass <- mass * 2.3
age <- age - 20
  • 上記のコードを実行し、massとageを比較するコマンドを書きましょう。massはageより大きいですか?

  • 作業環境を整理し、massとageの変数を削除しましょう。

チャレンジ:パッケージのインストール

以下のパッケージをインストールしてみましょう:

  • ggplot2
  • plyr
  • gapminder

RStudio のプロジェクト管理

質問と目的

質問:

  • R でプロジェクトをどのように管理できますか?

目的:

  • RStudio で自己完結型のプロジェクトを作成する

チャレンジ:プロジェクトの作成

RStudio で新しいプロジェクトを作成してみましょう:

  1. 「File」メニューをクリックし、「New Project」を選択します。
  2. 「New Directory」をクリックします。
  3. 「New Project」をクリックします。
  4. プロジェクトを保存するディレクトリの名前(例:my_project)を入力します。
  5. 「Create a git repository」のチェックボックスが表示される場合は選択します。
  6. 「Create Project」ボタンをクリックします。

チャレンジ:プロジェクトの開き方

ファイルシステムを使って RStudio のプロジェクトを開いてみましょう:

  1. RStudio を終了します。
  2. 先ほどのチャレンジで作成したプロジェクトのディレクトリに移動します。
  3. そのディレクトリ内の .Rproj ファイルをダブルクリックします。

チャレンジ:データの保存

このリンクから CSV ファイルをダウンロードしてください。

  1. ファイルをダウンロードします(上記リンクを右クリック -> 「リンク先を名前を付けて保存」/「名前を付けて保存」、またはリンクをクリックしページが読み込まれた後に Ctrl+S を押すか、メニューの「ファイル」 -> 「ページを名前を付けて保存」を選択)。
  2. gapminder_data.csv という名前で保存されていることを確認します。
  3. ファイルをプロジェクト内の data/ フォルダに保存します。

後ほどこのデータを読み込み、確認します。

チャレンジ:シェルの利用

R に読み込む前に、コマンドラインからデータセットについての一般的な情報を得ることは有益です。 これにより、R に読み込む際の判断に役立ちます。コマンドラインシェルを使用して以下の質問に答えてください:

  1. ファイルのサイズはどれくらいですか?
  2. このファイルには何行のデータがありますか?
  3. このファイルにはどのような値が含まれていますか?

ヒント: RStudio のコンソールペインにある「Terminal」タブを使用すると、RStudio 内で直接コマンドラインを操作できます。

チャレンジ:作業ディレクトリの確認1

getwd() コマンドを使用するか、RStudio のメニューを使って現在の作業ディレクトリを確認します。

  1. コンソールで getwd()(“wd” は “working directory” の略)と入力し、Enter を押します。
  2. ファイルペインで、data フォルダをダブルクリックして開く(または他の任意のフォルダに移動)。作業ディレクトリに戻るには、ファイルペインの「More」をクリックし、「Go To Working Directory」を選択します。

チャレンジ:作業ディレクトリの確認2

setwd() コマンドを使用するか、RStudio のメニューを使って作業ディレクトリを変更します。

  1. コンソールで setwd(“data”) と入力し、Enter を押します。その後、getwd() と入力して Enter を押し、新しい作業ディレクトリを確認します。
  2. RStudio ウィンドウ上部のメニューで「Session」をクリックし、「Set Working Directory」を選択して「Choose Directory」をクリックします。その後、開いたウィンドウでプロジェクトディレクトリに戻り、「Open」をクリックします。コンソールに setwd コマンドが自動的に表示されます。

R のデータ構造とデータフレーム

質問と目的

質問

  • R でデータをどのように読み取ることができますか?
  • データフレームをどのように操作できますか?

目的

  • データフレームを探索し始め、ベクトルやリストとの関連を理解する。
  • 行や列を追加または削除する。
  • データフレームのサイズ、列のクラス、名前、最初の数行などの基本的なプロパティを表示する。

チャレンジ:データフレームから変数、観測値、要素を取得する

下記の例を試して、それぞれが何を返すのかを説明してください。

  • cats[1]
  • cats[[1]]
  • cats$coat
  • cats[“coat”]
  • cats[1, 1]
  • cats[, 1]
  • cats[1, ]

ヒント: 返されるものを調べるには、typeof() 関数を使用してください。

チャレンジ:データフレームの作成

次の構文を使用して、新しいデータフレームを R 内で作成できます:

df <- data.frame(id = c("a", "b", "c"),
                 x = 1:3,
                 y = c(TRUE, TRUE, FALSE))

以下の情報を持つデータフレームを作成してください:

  • ラッキーナンバー

次に、rbind を使用して隣の人のエントリを追加しましょう。 最後に、cbind を使用して「コーヒーブレイクの時間ですか?」という質問への各人の回答を含む列を追加してください。

チャレンジ:データフレームの確認

データの最後の数行や中間のいくつかの行も確認するのが良い習慣です。これをどのように行いますか?

特に中間の行を探すのは難しくありませんが、ランダムな行をいくつか取得することもできます。これをどのようにコード化しますか?

チャレンジ:再現性のある分析のためのコードの保存と再利用

File -> New File -> R Script に移動し、gapminder データセットを読み込むための R スクリプトを作成します。このスクリプトを scripts/ ディレクトリに保存し、バージョン管理に追加してください。

その後、source 関数を使用してスクリプトを実行します。ファイルパスを引数として指定するか、RStudio の「Source」ボタンを押します。

データの部分集合化

質問と目的

質問

  • R でデータの部分集合をどのように扱うことができますか?

目的

  • データフレームの部分集合化を学ぶ
  • インデックス、名前、比較演算を使って個々の要素や複数の要素を抽出する方法を理解する
  • さまざまなデータ構造から要素をスキップまたは削除する方法を習得する

チャレンジ:データの部分の取得

次のコードが与えられた場合:

x <- c(5.4, 6.2, 7.1, 4.8, 7.5)
names(x) <- c('a', 'b', 'c', 'd', 'e')
print(x)
a   b   c   d   e
5.4 6.2 7.1 4.8 7.5 

次の出力を生成する少なくとも 2 つの異なるコマンドを考え出してください:

 b   c   d
6.2 7.1 4.8 

2 つの異なるコマンドを見つけたら、隣の人と比較してみてください。異なる戦略を持っていましたか?

チャレンジ:条件を満たす部分の取得

以下のコードを用いて:

x <- c(5.4, 6.2, 7.1, 4.8, 7.5)
names(x) <- c('a', 'b', 'c', 'd', 'e')
print(x)
 a   b   c   d   e
5.4 6.2 7.1 4.8 7.5 

x から 4 より大きく 7 未満の値を返すサブセットコマンドを書いてください。

チャレンジ:データを抽出するための論理ベクトルの作成1

ベクトルの要素を、特定のリスト内のいずれかと一致させる操作は、データ解析で非常に一般的なタスクです。 例えば、gapminder データセットには countrycontinent の変数がありますが、これらの間の情報は含まれていません。 東南アジアの情報を抽出したいとします。このとき、どのようにして東南アジアのすべての国について TRUE、それ以外を FALSE とする論理ベクトルを作成しますか?

以下のデータを使用します:

seAsia <- c("Myanmar","Thailand","Cambodia","Vietnam","Laos")
## エピソード2でダウンロードした gapminder データを読み込む
gapminder <- read.csv("data/gapminder_data.csv", header=TRUE)
## データフレームから `country` 列を抽出(詳細は後述);
## factor を文字列に変換;
## 重複しない要素のみ取得
countries <- unique(as.character(gapminder$country))

チャレンジ:データを抽出するための論理ベクトルの作成2

以下の3つの方法を試し、それぞれがどのように(正しくない、または正しい方法で)動作するのか説明してください:

  1. 間違った方法(== のみを使用)
  2. 不格好な方法(論理演算子 ==| を使用)
  3. エレガントな方法(%in% を使用)

チャレンジ:データフレームサブセットエラーの修正

以下の一般的なデータフレームサブセットエラーを修正してください:

  1. 年 1957 の観測値を抽出する
gapminder[gapminder$year = 1957,]
  1. 1列目から4列目以外のすべての列を抽出する
gapminder[,-1:4]
  1. 寿命が80年以上の行を抽出する
gapminder[gapminder$lifeExp > 80]
  1. 1行目と4列目、5列目(continentlifeExp)を抽出する
gapminder[1, 4, 5]
  1. 応用:年 2002 年と 2007 年の情報を含む行を抽出する
gapminder[gapminder$year == 2002 | 2007,]

チャレンジ:データフレームのサブセットへのアクセス

  1. なぜ gapminder[1:20] はエラーを返すのでしょうか? gapminder[1:20, ] とはどう異なるのでしょうか?

  2. 行 1 から 9 と 19 から 23 のみを含む新しい data.frame を作成し、それを gapminder_small と名付けてください。この操作は 1 ステップまたは 2 ステップで行うことができます。

ggplot2 を使用した出版品質のグラフィック作成

質問と目的

質問

  • R で出版品質のグラフィックを作成するにはどうすればよいですか?

目的

  • ggplot2 を使用して出版品質のグラフィックを作成できるようになる。
  • 異なる色、形状、線を使用してプロットの美的要素を操作する。
  • ggplot2 を使用して作成したプロットをディスクに保存する。

チャレンジ

例を修正して、平均寿命が時間とともにどのように変化したかを示す図を作成してください:

ggplot(
  data = gapminder,
  mapping = aes(x = gdpPercap, y = lifeExp)) +
  geom_point()

ヒント:gapminder データセットには “year” という列があり、これを X 軸に表示する必要があります。

チャレンジ

ポイントレイヤーとラインレイヤーの両方を入れてみてください。何が起こるでしょうか?

チャレンジA

前の例のポイントレイヤーで、ポイントの色とサイズを変更してください。

ヒント:aes 関数を使用しないでください。

ヒント:ポイントに対する linewidth に相当するものは size です。

チャレンジB

チャレンジA の解答を修正し、ポイントの形状を変更し、大陸ごとに異なる色と新しいトレンドラインを追加してください。

ヒント:color 引数は aes 関数のマッピング内で使用できます。

チャレンジ

異なる大陸間で利用可能な年における平均寿命を比較するボックスプロットを生成してください。

応用:

  • Y軸の名前を「Life Expectancy」に変更する。
  • X軸のラベルを削除する。

チャレンジ:ggplot2 の出力のファイル保存

‘pdf’ コマンドを変更して、PDFの2ページ目を作成し、 同じデータを使って facet_grid を使用して大陸ごとに1つのパネルを表示するプロットを追加してください。

チャレンジ:データフレームのサブセットのファイル保存

gapminder データを1990年以降に収集されたデータポイントのみを含むようにサブセット化する データクリーニングスクリプトファイルを作成してください。

このスクリプトを使用して、新しいサブセットを cleaned-data/ ディレクトリに保存してください。

集合写真

  • 「公開しても大丈夫」という方は、ぜひご協力ください。

  • 後ろから撮影した集合写真を公開する場合があります。もし公開を希望されない場合は、お知らせください。