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

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

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

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

385閲覧

薬剤使用の重複期間を考慮して変数のフラグを立てたい

iharayasutaka0

総合スコア2

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

1グッド

0クリップ

投稿2024/01/11 03:49

編集2024/01/11 05:53

実現したいこと

aaa <- data.frame(id = c(1, 2, 2, 3, 3, 3),
drug = c("A", "B", "C", "B", "C", "A"),
time0 = c(0, 0, 0, 169, 752, 0),
time1 = c(214, 432, 381, 190, 988, 28))

bbb <- data.frame(id = c(1, 2, 2, 3, 3, 3),
drug = c("A", "B+C", "B", "A", "B", "C"),
time0 = c(0, 0, 381, 0, 169, 752),
time1 = c(214, 382, 432, 28, 190, 988))

aaaのデータからbbbのデータを再現したい。

発生している問題・分からないこと

idが2番の方において、Bを0-432日まで使用、Cを0-381日まで使用しております。0-381日までは、BとCを一緒に使っているため、drugの変数をB+Cとしたい。そして、382-432日までは、Bのみなので、drugの変数をCとしたい。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

bbb <- aaa %>%
arrange(id, drug) %>%
group_by(id) %>%
summarise(
drug = paste(drug, collapse = "+"),
time0 = ifelse(any(time0 != 0), min(time0), 0),
time1 = max(time1)
)など様々な事を試したが、ダメでした。

補足

特になし

cuttlefish44👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

データサイズ・PCスペック的に問題ないのならば、
from to 形式を1刻みデータに展開し、
その上で集計するのが最も容易です

library(tidyverse) aaa <- data.frame(id = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4), drug = c("A", "B", "C", "B", "C", "A", "A", "B", "C", "D"), time0 = c(0, 0, 0, 169, 752, 0, 0, 14, 56, 266), time1 = c(214, 432, 381, 190, 988, 28, 267, 564, 57, 688)) bbb <- data.frame(id = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4), drug = c("A", "B+C", "B", "A", "B", "C", "A", "A+B", "A+B+C","A+B","A+B+D", "B+D", "D"), time0 = c(0, 0, 382, 0, 169, 752, 0, 14, 56, 58, 266, 268, 565), time1 = c(214, 381, 432, 28, 190, 988, 13, 55, 57, 265, 267, 564, 688)) # time0の3つめ、time1の2つめについて、typoと判断して修正しました aaa %>% rowwise() %>% # 行単位で、time0-time1の1刻みtibbleをnest形式で持つ mutate(seqtime_list = list(tibble(time = time0:time1))) %>% ungroup() %>% unnest(seqtime_list) %>% # nestを解除する (nest列はtibbleなので縦に展開される) arrange(id, time, drug) %>% # (追加) 薬の並びがアルファベット順になるようソート group_by(id, time) %>% summarize(drug = paste(drug, collapse = "+"), .groups = "drop") %>% group_by(id) %>% mutate(lag_drug = lag(drug, default = drug[1]), not_cont_flg = as.numeric(drug != lag_drug), gr_ind = cumsum(not_cont_flg)) %>% # 同じ薬sでの継続利用グループ番号を作成 group_by(id, drug, gr_ind) %>% # 薬sと継続利用グループ番号でmin, maxを作成 summarize(time0 = min(time), time1 = max(time), .groups = "drop") %>% arrange(id, time0) %>% # 単なる見栄えソート select(-gr_ind) ## 結果 # id drug time0 time1 # <dbl> <chr> <int> <int> # 1 1 A 0 214 # 2 2 B+C 0 381 # 3 2 B 382 432 # 4 3 A 0 28 # 5 3 B 169 190 # 6 3 C 752 988 # 7 4 A 0 13 # 8 4 A+B 14 55 # 9 4 A+B+C 56 57 # 10 4 A+B 58 265 # 11 4 A+B+D 266 267 # 12 4 B+D 268 564 # 13 4 D 565 688

投稿2024/01/11 07:02

編集2024/01/12 03:23
cuttlefish44

総合スコア85

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

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

iharayasutaka0

2024/01/11 09:11

ご教示いただきありがとうございます。 上記の件で回したところ問題なくbbbを作成することが出来ました。 ありがとうございます。 本データで回したところ少し問題が生じましたので、追加でご質問させていただきたく存じます。 以下のaaaのデータをbbbのデータのようにすることはできますでしょうか。 大変恐縮ではございますが、もし出来ましたらご回答いただけますと幸いです。 何卒よろしくお願い申し上げます。 aaa <- data.frame(id = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4), drug = c("A", "B", "C", "B", "C", "A", "A", "B", "C", "D"), time0 = c(0, 0, 0, 169, 752, 0, 0, 14, 56, 266), time1 = c(214, 432, 381, 190, 988, 28, 267, 564, 57, 688)) bbb <- data.frame(id = c(1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4), drug = c("A", "B+C", "B", "A", "B", "C", "A", "A+B", "A+B+C","A+B","A+B+D", "B+D", "D"), time0 = c(0, 0, 381, 0, 169, 752, 0, 14, 56, 58, 266, 268, 565), time1 = c(214, 382, 432, 28, 190, 988, 13, 55, 57, 265, 267, 564, 688))
cuttlefish44

2024/01/12 02:43

確かに、コメントでご提示いただいたようなデータに対応していませんね、失礼しました こちら対応できるよう修正しました
iharayasutaka0

2024/01/12 13:10

修正していただきありがとうございました。 無事に解決することが出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問