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