---
title: tidyverse in 10 minutes
tags: 
author: [森岡裕[SASユーザー総会世話人]](https://convert.docswell.com/user/6484025)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/8JDKY9QMEG.jpg?width=480
description: R with Pharma Lab #Meeting 1(2026-04-08) 用資料
published: March 17, 26
canonical: https://convert.docswell.com/s/6484025/Z4N3DL-2026-03-17-143632
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/8JDKY9QMEG.jpg)

tidyverse in 10 minutes
Yutaka Morioka


# Page. 2

![Page Image](https://bcdn.docswell.com/page/VEPK6ZLQ78.jpg)

tidyverse
install.packages(“tidyverse“)
library(tidyverse)
現時点(2026-03-16)のtidyverse 2.0.0では
library(tidyverse)で
9つのコアパッケージがアタッチされる
便利ツールのおまとめパックのイメージ
https://tidyverse.org/
ただし！！
Tidyverseは単なる
独立したパッケージの寄せ集めではない．
全体として哲学・方向性を持った
統合コレクション・エコシステムである
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/27VV3WQP7Q.jpg)

tidyverseの思想・哲学周り
manifesto (tidyverseの哲学/ユーザー,コミュニティ向け)
unifying（tidyverseの設計ガイド,開発者向け））
１新しい独自データ型を乱立させず、data.frame や vector など
既存の構造をそのまま使う
２.小さな関数をパイプでつなぎ、処理を段階的に構成する]
３.ループよりも関数（mapなど）を使って処理を書く
４.人間が読みやすく理解しやすいAPIにする
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/5JGL3DWQ7L.jpg)

Tidy Data (ちゃんとしたデータ構造がすべての基礎)
幸せな家庭どれも似た形をとる
不幸な家庭はそれぞれ異なる形で不幸である
（トルストイ，アンナ・カレーニナの書き出し）
ちゃんとした（Tidyな）データセットはどれも同じ構造をしているが，
アカン（Messyな）データセットはそれぞれちゃう形でアカン
TidyではないMessyなデータの例
・列名が変数名ではなく値そのものを表している，[WBC], [RBC], [Hb] みたいな
・1つの列に複数の意味が格納されている [SEX_and_AGE]: “Male,45“ みたいな
・変数が行と列の両方に格納されている
・単一のオブザベーションが意味もなく複数のテーブルに分割されている
Hadley Wickham氏らが中心と
なってtidyverseは作られた
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/47QY513WEP.jpg)

tibble
tidyverseで使うために設計されたデータフレームで、基本は
data.frame と同じ「表形式」ですが、tidy data を扱いやすくす
るための設計がされている
wk1 &lt;- tibble(
SUBJID = c(“A001“,“A002“,“B001“)
,AGE = c(20, 21, 19),
SEX = c(“F“,“M“,“F“))
★文字列を勝手にfactorにしない⇒常にcharacterなので御しやすい
★列名の部分一致を許さない⇒df$agでageがとれてしまうがtb$agはエラー
★サイズの一貫性⇒tibble( x = 1:3, y = 1:2) 3行と2行で不一致でエラー
★リスト列を扱いやすいので，JSONやネスト構造，モデルを持ちやすい
data.frame は便利だが、挙動が不安定で tidy なデータ操作を妨げることがある
ので，data.fraeを拡張してtibbleを作った
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/KE4W9R11J1.jpg)

データ読み込み
データ整形
データ操作
データ可視化
反復処理
カテゴリ処理
文字列処理
日時処理
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/L71YKQG5JG.jpg)

readr
wk2 &lt;- read_csv(“C:/Users/xxxxx/Documents/test.csv“)
test.csv
関数
read_csv()
read_tsv()
read_delim()
read_fwf()
read_table()
用途
CSV
TSV
任意区切り
固定長
空白区切り
★base R の read.csv() より 高速
★ tibble形式で返ってくるのでtidyverseと相性良
★勝手に因子型にせず文字型で読み込む
以下はCOREパッケージではないので
library(readxl)のような明示的なアタッチが必要
readxl
haven
jsonlite
xml2
httr
rvest
.xls, .xlsxファイル
SPSS, Stata, SASデータ
JSONデータ
XML, HTMLデータ
Web API通信
Webスクレイピング
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/G7WGDMKWE2.jpg)

tidyr
tidyrはデータを tidy data（ちゃんとしたデータ）構造に変換すること
を目的として，構造変換系の関数が多い
横持ち⇒縦持ち
縦横転置
pivot関数は代表格で
横持ち(wide)⇔縦持ち(long)の変換
SASでいうproc tanspose
t_raw1 &lt;- pivot_longer( raw1, cols =
VISIT1:VISIT3, names_to = “Visit“,
values_to = “value“)
t_raw2 &lt;- pivot_wider( t_raw1,
names_from = Visit, values_from =
value)
縦持ち⇒横持ち
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4JZLGQZ2E3.jpg)

tidyr
列の分割
列の分割結合
sp_raw10 &lt;- separate(raw10, col =
“WEIGHT_HEIGHT“, into =
c(“WEIGHT“,“HEIGHT“), sep = “_“)
列の結合
unite_raw10 &lt;- unite(sp_raw10,
WEIGHT_HEIGHT, WEIGHT,
HEIGHT, sep = “_“)
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/YE6WY686EV.jpg)

dplyr
dplyrは データハンドリングパッケージで，抽出・変換・集計を行う
ために使われます
基本動詞（verbs）
dplyrには verbsと言われる基本操作がある
関数
filter()
select()
mutate()
summarise()
arrange()
意味
行を抽出
列(変数)を選択
新しい列(変数)を作る
集計
並び替え
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GE5MG695E4.jpg)

dplyr
# dplyr説明用 サンプルデータ作成
df &lt;- tibble( SUBJID = 1:6,
SEX = c(“F“, “M“, “F“, “M“, “F“, “M“),
WEIGHT = c(50, 72, 60, 85, 55, 90),
HEIGHT = c(160, 175, 165, 180, 158, 178))
out1 &lt;- df
|&gt;
mutate( BMI = WEIGHT / (HEIGHT/100)^2) mutateによりBMIを計算して変数追加
|&gt;
filterによりBMIが20以上の行を抽出
filter(BMI &gt;= 20)
|&gt;
arrange(SEX, BMI) arrangeによりSEX, BMIで昇順ソート
|&gt;
select(-WEIGHT, -HEIGHT)
selectのマイナス指定により
WEIGHT, HEIGHTの変数をドロップ
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/9729YM2GJR.jpg)

ggplot2
ggplot2はビジュアライゼーション理論「The Grammar of Graphics (Leland Wilkinson)」に基づいて
いて，宣言的にグラフを作成するシステム．
ggplot2はグラフを構成要素「レイヤー（層）」に分けて，重ねていく．
Tidy Dataをキャンパスにセットして指定していくイメージ
ggplot(df,
aes(x = HEIGHT,
y = WEIGHT,
shape = SEX))
+ geom_point(size = 3)
+ labs( x = “Height (cm)“,
y = “Weight (kg)“,
title = “Height vs Weight by Sex“ )
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/DJY4GXYG7M.jpg)

purrr
反復処理（ループ）を制御
R言語における伝統的なループのアプローチはforループやapply系関数を使用することでしたが，
これらは複雑になりがちで，さらに戻りのデータ型が入力に依存して予期せず変化するという
大きい欠点があったりした．
それを解決するためのtidyverseの解がpurrrパッケージ．map関数が中核を担う
1から5までのルート計算
map(.x, .f)
繰り返し対象xに対してfの処理を行う
1から5までの二乗
2つのベクトルを足し合わせて新しいものを作る
x &lt;- list( c(1,2,3),
c(4,5,6),
c(7,8,9))
map_dbl(x, mean)
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/V7NYG1P8E8.jpg)

stringer, forcats, lubridate
R にはもともと文字列処理関数がありますが,
grep, gsub, substr, ncharなどは 関数名や引数の形式が統一されていません
stringr はすべての関数を str_ で始め、一貫した書き方にすることを目的とした文字列操作パッケージ
・str_detect(“clinical trial“, “trial“) #文字列検出，第一引数に第二引数が含まれるか，この場合はTRUE
・str_extract(“Subject ID: 123“, “¥¥d+“) #文字列抽出，この場合戻り値は123
・str_replace(“A-B-C“, “-“, “_“) #文字列置換，この場合戻り値はA_B_C
“for categorical variables“（カテゴリ変数のため）を目的として，R の factor を直感的に操作できるようにするた
めのパッケージで，ggplot2などでグラフにおけるカテゴリ変数を制御する際などに多用される
sex &lt;- factor(c(“F“, “M“, “F“, “F“, “M“))
・fct_relevel(sex, “M“, “F“) # レベル順序変更
・fct_rev(sex) # レベル順序反転
・fct_infreq(sex) #頻度順に並び変え
日付・時刻（date / time）を扱うための パッケージ. R の標準の日付処理は扱いにくい部分があるため，直
感的な関数で日付・時間を操作できるようにすることを目的に作られている
・date &lt;- ymd(&quot;2025-03-17&quot;)
・ymd_hms(&quot;2025-03-17 10:30:00&quot;)
・date2 &lt;- date + days(7) #日付計算
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/YJ9PW53X73.jpg)

pharmaverse
臨床試験のOSSエコシステム
pharmaverseは名前からしてtidyverseを
パクっている！
https://pharmaverse.org/
pharmaverse は tidyverseを下敷きにしている
• tidyverseの思想を借りている
• tidyverse上に構築されている
• tidyverseの設計を踏襲している
tidyverse = 汎用データ分析
pharmaverse = 臨床試験専用拡張
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GJ8DNYM9JD.jpg)

tidyverseと臨床試験業務への個人的な所感
統制のとれたデータハンドリングのワークフローとしてtidyverseを利用するこ
とは比較的自然で，世間的にも多分一般的といっていいはず．
本日午前の舟尾さんのハンズオンでBase.Rの基礎を身に着けたうえで，次に手
をだしていくのであれば tidyverseに触れてみるといいかも
pharmaverse等も明らかにtidyverseを下敷きにしているので，臨床試験業務にR
をとりいれ，様々なパッケージを運用していくうえでもtidyverseは結構基礎知
識になるはず
tidyverseの根底にあるtidyなデータを起点にして，わかりやすい処理をつなぐと
いう思想はCDISC業務や，トレーサビリティを重視する臨床試験プログラミン
グとかなり相性がよい
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LJLMP43MER.jpg)

SASプログラマのSAS脳にはBase.Rより向いてそう
tidyverseスタイルでハンドリングすると処理をパイプでつないでいくと
手続き型っぽくなるので，SASのデータステップ，プロシジャステップと似る．
今までRに挫折してきた人にも案外すんなる刺さるかも？？
out1 &lt;df
|&gt;
mutate( BMI = WEIGHT / (HEIGHT/100)^2)
|&gt;
filter(BMI &gt;= 20)
|&gt;
select(-WEIGHT, -HEIGHT)
|&gt;
arrange(SEX, BMI)
data out1;
set df;
BMI = WEIGHT / (HEIGHT/100) ** 2;
if 20 &lt;= BMI;
drop WEIGHT HEIGHT;
run;
proc sort data = out1;
by SEX BMI;
run;
どこか似ている
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/47MY4KD67W.jpg)

ご清聴ありがとうございました！！！
18


