実現したいこと
医療データを分析しています。
手術実施の患者に関して手術後60日以内に投与される薬剤を調べて、ある薬剤の組み合わせであればそれらの薬剤のdataが入力されている行のみ削除したいと思っています。(複数回手術のある患者に関して、それぞれの手術に関してうまく手術実施後の薬剤を特定できず困っています)
また試行錯誤していますが、薬剤Aと薬剤Bのみを投与された患者を定義したいのに、薬剤AとBとCを投与されている患者のA薬B薬のdataも削除されうまく出力されません。
色々調べながら実施していますが、うまく出力されません。
またデータフレーム全体を分析していますが、手術未実施の患者データが消えるケースもあり、困っております。
発生している問題・分からないこと
コードを実行してもうまく出力されない。
エラーメッセージ
error
1エラーは出ずに出力されるのですが、うまく目的としている出力になりません。
該当のソースコード
R
1# 必要なパッケージの読み込み 2library(dplyr) 3library(lubridate) 4 5# サンプルデータフレームの作成 6df <- data.frame( 7 patient_id = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5), 8 drugname = c("手術", "薬剤A", "薬剤B", "薬剤C", "手術", "薬剤A", "薬剤C", "手術", "薬剤A", "薬剤B", "手術", "手術", "薬剤C", "薬剤D", "手術", "薬剤A", "薬剤B"), 9 actdate = as.Date(c("2025-01-01", "2025-01-15", "2025-01-20", "2025-02-01", "2025-02-01", "2025-02-10", "2025-02-20", "2025-03-01", "2025-03-10", "2025-03-15", "2025-04-01", "2025-04-01", "2025-04-05", "2025-04-10", "2025-05-01", "2025-05-10", "2025-05-15")), 10 dosage = c(NA, 100, 150, 200, NA, 100, 150, NA, 100, 150, NA, NA, 200, 250, NA, 100, 150), 11 Surgery_Flag = c(1, NA, NA, NA, 1, NA, NA, 1, NA, NA, 1, 1, NA, NA, 1, NA, NA) 12) 13 14# 手術日を抽出 15surgery_dates <- df %>% 16 filter(Surgery_Flag == 1) %>% 17 select(patient_id, surgery_date = actdate) 18 19# 手術日から2か月以内に投与された薬剤を抽出 20df_within_2months <- df %>% 21 filter(is.na(Surgery_Flag)) %>% # 手術以外の行を対象 22 left_join(surgery_dates, by = "patient_id") %>% 23 filter(actdate > surgery_date & actdate <= surgery_date %m+% months(2)) 24 25# 削除したいレジメンを定義(例: "薬剤A" と "薬剤B" の組み合わせ) 26regimen_to_remove <- c("薬剤A", "薬剤B") 27 28# 各患者ごとに手術日から2か月以内に投与された薬剤の組み合わせ(レジメン)を特定し、特定のレジメンを含むか確認 29patients_to_remove <- df_within_2months %>% 30 group_by(patient_id, surgery_date) %>% 31 summarise(regimen = list(sort(unique(drugname))), .groups = 'drop') %>% 32 filter(all(regimen_to_remove %in% regimen)) %>% 33 select(patient_id, surgery_date) 34 35# 元のデータフレームから特定のレジメンを含む投与記録を削除 36df_filtered <- df %>% 37 left_join(patients_to_remove, by = c("patient_id"), relationship = "many-to-many") %>% 38 filter(is.na(surgery_date) | !(actdate > surgery_date & actdate <= surgery_date %m+% months(2) & drugname %in% regimen_to_remove)) %>% 39 select(-surgery_date) 40 41# 結果の表示 42print(df_filtered) 43
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
出力されるのですが、目的としている出力結果が得られていません。
補足
特になし
以下の行ですが、is.na(surgery_date) | !(actdate > ... ではなく is.na(surgery_date) & !(actdate > ... ではないでしょうか。(OR ではなく AND)
> filter(is.na(surgery_date) | !(actdate > surgery_date & actdate <= surgery_date %m+% months(2) & drugname %in% regimen_to_remove)) %>%
コメントありがとうございます。A薬B薬のみ投与されているケースではうまく削除されるのですがpatient_id1AとBとCを投与された患者の薬剤Aと薬剤Bも削除されてしまっております。ABCが投与されている場合はABの行を削除せずに分析したいと思っております。
また上記に記載したデータフレームとは異なるのですが実際の分析データですと複数回手術を受けた患者の場合に2回目の手術後の薬剤がうまく削除できませんでした。
また手術未実施症例も実データには含まれているのですが、未実施データがまるまる消えてしまい困っておりました。
