tidyverse in 10 minutes

264 Views

March 17, 26

スライド概要

R with Pharma Lab #Meeting 1(2026-04-08) 用資料

profile-image

SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

tidyverse in 10 minutes Yutaka Morioka

2.

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

3.

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

4.

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

5.

tibble tidyverseで使うために設計されたデータフレームで、基本は data.frame と同じ「表形式」ですが、tidy data を扱いやすくす るための設計がされている wk1 <- 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

6.

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

7.

readr wk2 <- 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

8.

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

9.

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

10.

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

11.

dplyr # dplyr説明用 サンプルデータ作成 df <- 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 <- df |> mutate( BMI = WEIGHT / (HEIGHT/100)^2) mutateによりBMIを計算して変数追加 |> filterによりBMIが20以上の行を抽出 filter(BMI >= 20) |> arrange(SEX, BMI) arrangeによりSEX, BMIで昇順ソート |> select(-WEIGHT, -HEIGHT) selectのマイナス指定により WEIGHT, HEIGHTの変数をドロップ 11

12.

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

13.

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

14.

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 <- factor(c(“F“, “M“, “F“, “F“, “M“)) ・fct_relevel(sex, “M“, “F“) # レベル順序変更 ・fct_rev(sex) # レベル順序反転 ・fct_infreq(sex) #頻度順に並び変え 日付・時刻(date / time)を扱うための パッケージ. R の標準の日付処理は扱いにくい部分があるため,直 感的な関数で日付・時間を操作できるようにすることを目的に作られている ・date <- ymd("2025-03-17") ・ymd_hms("2025-03-17 10:30:00") ・date2 <- date + days(7) #日付計算 14

15.

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

16.

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

17.

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

18.

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