5 データ編集

  • サンプルデータで実行例を示す

5.1 列の追加

5.1.1 mutate

drug2 <- mutate(drug, dose_amount_2 = dose_amount * 2)
drug2

5.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 マッチしたデータを横に結合

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 文字列置換

5.19.3 文字列削除

  • str_remove()

5.20 正規表現