質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.32%
RStudio

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

Q&A

1回答

158閲覧

Rでの分析がうまく出力されない

keikmyo

総合スコア10

RStudio

RStudioは、Rのプログラミングを効率化する統合開発環境です。統計計算とグラフィックスができるプログラミング言語であるRのIDEでOSSで公開されています。ソースコードやコンソールなどが一つの画面に見やすく配置されている点が特徴。コマンド名以外に、関数名やパッケージ名も補完できます。

0グッド

0クリップ

投稿2025/02/28 10:55

実現したいこと

医療データを分析しています。
手術実施の患者に関して手術後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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

出力されるのですが、目的としている出力結果が得られていません。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2025/02/28 11:17

以下の行ですが、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)) %>%
keikmyo

2025/02/28 11:40

コメントありがとうございます。A薬B薬のみ投与されているケースではうまく削除されるのですがpatient_id1AとBとCを投与された患者の薬剤Aと薬剤Bも削除されてしまっております。ABCが投与されている場合はABの行を削除せずに分析したいと思っております。 また上記に記載したデータフレームとは異なるのですが実際の分析データですと複数回手術を受けた患者の場合に2回目の手術後の薬剤がうまく削除できませんでした。 また手術未実施症例も実データには含まれているのですが、未実施データがまるまる消えてしまい困っておりました。
guest

回答1

0

dplyr::group_by()dplyr::group_map() を利用して、削除する投与記録の行番号を抽出します。

r

1# 削除したいレジメンを定義(例: "薬剤A" と "薬剤B" の組み合わせ) 2regimen_to_remove <- c("薬剤A", "薬剤B") 3 4# 特定のレジメンを含む投与記録の行番号を抽出 5removed_idx <- df %>% 6 mutate(rownum = row_number()) %>% 7 group_by(patient_id) %>% 8 group_map(\(grp, ...){ 9 drugs = grp %>% filter(is.na(Surgery_Flag)) 10 grp %>% 11 filter(Surgery_Flag == 1) %>% 12 rowwise() %>% 13 group_map(~ { 14 surgery_date = .x$actdate 15 drugs %>% 16 filter(actdate > surgery_date & actdate <= surgery_date %m+% months(2)) %>% 17 filter(setequal(drugname, regimen_to_remove)) %>% 18 select(rownum) 19 }) 20 }) %>% unlist(use.names=FALSE) 21 22# 元のデータフレームから特定のレジメンを含む投与記録を削除 23df_filtered <- df %>% slice(-removed_idx) 24 25# 結果の表示 26print(df_filtered) 27 28# patient_id drugname actdate dosage Surgery_Flag 29# 1 1 手術 2025-01-01 NA 1 30# 2 1 薬剤A 2025-01-15 100 NA 31# 3 1 薬剤B 2025-01-20 150 NA 32# 4 1 薬剤C 2025-02-01 200 NA 33# 5 2 手術 2025-02-01 NA 1 34# 6 2 薬剤A 2025-02-10 100 NA 35# 7 2 薬剤C 2025-02-20 150 NA 36# 8 3 手術 2025-03-01 NA 1 37# 9 3 手術 2025-04-01 NA 1 38# 10 4 手術 2025-04-01 NA 1 39# 11 4 薬剤C 2025-04-05 200 NA 40# 12 4 薬剤D 2025-04-10 250 NA 41# 13 5 手術 2025-05-01 NA 1

投稿2025/03/01 10:44

編集2025/03/01 10:57
melian

総合スコア21063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keikmyo

2025/03/01 11:30

ありがとうございます!作成したデータフレームでは解決できました。chatgptでも何度も調べたりしましたが 何度行ってもうまくいかず困っておりました。いったん、実際のデータフレームにて実施させていただき、うまく動作するか確認させていただきます。 確認後、再度、動作しましたらベストアンサーとさせていただきます。
keikmyo

2025/03/03 07:59

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.32%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問