5 データ編集
- サンプルデータで実行例を示す
5.1 列の追加
5.1.1 mutate
<- mutate(drug, dose_amount_2 = dose_amount * 2)
drug2 drug2
5.1.2 add_column
- 指定の位置に列を追加
%>%
drug add_column(new_var = "value", .before = "id")
5.1.3 複数の列から最大や最小を求める
- maxやminは基本列方向にしか働かないためrowwiseを使う
- よりよい書き方ありますか?
<- disease %>%
df rename(date_dis = date) %>% # 列名重複を避ける為に変更しておく
inner_join(drug, "id") %>% # 結合
rowwise() %>%
mutate(date_max = max(date, date_dis, na.rm = TRUE)) # NAは除外
5.1.4 条件分岐
- if_else()
- case_when()
5.1.5 ビニング
# mutate(bmigp = case_when(bmi < 25 ~ 1, 25 <= bmi & bmi < 30 ~ 2, 30 <= bmi ~ 3))
# mutate(bmigp=cut(bmi, c(0, 25, 30, 40), labels=c(“nwt”, “owt”, “obese”), LEFT =FALSE))
5.1.6 1行ずらす
- lag()
- lead()
5.2 列の編集
5.2.1 mutate
- mutateで既存の列を指定すれば上書きになる
<- mutate(drug, dose_amount = as.character(dose_amount)) drug2
5.2.2 mutate, across
- 制作中
5.3 列の選択
- selectを使う
- 列番号または列名による指定が可能
<- drug %>%
drug2 select(1, 3)
<- drug %>%
drug2 select(id, atccode)
5.4 列の削除
- selectで「!」を使うと削除になる
- 列番号または列名による指定が可能
<- drug %>%
drug2 select(!2, !4)
<- drug %>%
drug2 select(!id, !atccode)
5.4.1 列名が重複してる場合
- 列名が重複してるデータをもらった場合、select等で列名を指定することができない
tibble::repair_names()
を使うと列名の重複を解消してくれる
5.5 列の入替
- 列番号または列名による指定が可能
<- patient %>%
patient2 select(2, 3, 1)
<- patient %>%
patient2 select(gender, start_date, id)
5.6 列名関連
5.7 列名確認
colnames(patient)
5.7.1 一部変更
<- patient %>%
patient2 rename(patientid = id)
5.7.2 全体変更
<- patient %>%
patient2 set_colnames(c("col1", "col2", "col3"))
5.8 列の作成・選択・入替・名前変更を一括で
- transmuteを使うと上記の作業を一行で書くことができる
<- patient %>%
patient2 transmute(gender, patientid = id)
5.9 並べ替え
- 複数の列をキーにして並べ替えることもできる
<- patient %>%
patient2 arrange(start_date)
5.10 条件によるフィルタ
# idが1の患者み
<- patient %>%
patient2 filter(id == 1)
# idが5以下の患者のみ
<- patient %>%
patient2 filter(id <= 5)
# genderがMの患者のみ
<- patient %>%
patient2 filter(gender == "M")
5.11 その人のx番目の行を取得
- row_number()を使う
<- disease %>%
disease2 group_by(id) %>%
filter(row_number() == 2) %>% # ここの数字を変えてx番目の行を取得
ungroup()
5.12 その人の上からx番目の行を取得
row_number()
の例を不等号に変えればできるが、top_n()
の例を示す
<- disease %>%
disease2 group_by(id) %>%
top_n(2, date) %>% # ここの数字を変えて1~x番目の行を取得
ungroup()
5.13 特定のデータフレームの列に含まれる行を抽出
filter
と%in%
か、semi_join
を使う
# 一例としてデータフレームを作成する
<- data.frame(id = c(1, 3, 5), var = c("a", "b", "c"))
df
<- filter(patient, id %in% df$id)
patient2 <- semi_join(patient, df, "id") patient2
5.14 特定のデータフレームの列に含まれない行を抽出
filter
と%in%
か、anti_join
を使う
# 一例としてデータフレームを作成する
<- data.frame(id = c(1, 3, 5), var = c("a", "b", "c"))
df
<- filter(patient, !(id %in% df$id))
patient2 <- anti_join(patient, df, "id") patient2
5.15 重複削除
- 初回処方日や初診断月の特定に用いることが多い
5.15.1 distinct
<- drug %>%
drug2 distinct(id, .keep_all = TRUE)
5.15.2 first
<- drug %>%
drug2 group_by(id) %>%
first() %>%
ungroup()
5.16 データを縦に結合
<- bind_rows(patient, patient) patient2
5.17 データを横に結合
<- bind_cols(patient, patient) patient2
5.18 マッチしたデータを横に結合
- 基本的にleft_joinとinner_joinが使えればOK
- 使い分けについては以下URLなどを参考に
- https://qiita.com/matsuou1/items/b1bd9778610e3a586e71
<- left_join(patient, disease, "id") df
<- inner_join(patient, disease, "id") df
- 2つのデータで同名の列があると接尾に「.x」と「.y」がつくが、suffixを使うと自分で指定できる
<- inner_join(drug, disease, "id", suffix = c("_drug", "_disease")) df
5.19 部分一致
5.19.1 文字列一致判定
- str_detect()
5.19.2 文字列置換
- str_replace(), str_replace_all()
- https://qiita.com/kazutan/items/0b690961d4516e48f6c0
5.19.3 文字列削除
- str_remove()