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

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

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

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

Q&A

解決済

2回答

182閲覧

繰り返しデータ:条件付きでNAを埋めたい

iharayasutaka0

総合スコア2

R

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

0グッド

0クリップ

投稿2024/02/18 10:12

実現したいこと

data <- data.frame(id = c(rep(1, 5), rep(2, 5), rep(2, 5)),
phase = c(rep(1:5,3)),
tyra = c(c("A", "A", "A", NA, NA),
c("無治療", NA, NA, "A", "A"),
c("無治療", NA, "A", NA, NA)))

上記のデータから以下のデータを作成してほしいです。

data <- data.frame(id = c(rep(1, 5), rep(2, 5), rep(2, 5)),
phase = c(rep(1:5,3)),
tyra = c(c("A", "A", "A", "中断", "無治療"),
c("無治療", "無治療", "無治療", "A", "A"),
c("無治療", "無治療", "A", "中断", "無治療")))

前提

tyraは"無治療", "中断", "A"の3つです。

data <- data.frame(id = c(rep(1, 5), rep(2, 5), rep(2, 5)),
phase = c(rep(1:5,3)),
tyra = c(c("A", "A", "A", NA, NA),
c("無治療", NA, NA, "A", "A"),
c("無治療", NA, "A", NA, NA)))

idが1の人は、phaseが1-3に関しては、"A"(typaの変数)が用いられたが、phase4からはNA(typaの変数)になっています。
そのため、phase4のtypaには、"A”が終了したことを意味する"中断"のフラグを立ててほしいです。
phase4のtypaの変数に”中断”のフラグを立てた後は、phase5では"無治療"のフラグを立ててほしいです。
(前のphaseが"中断"であれば、次のphaseは"無治療"にしたいです。)

idが2の人は、phase1のtypaが"無治療"でphase2-3はNAになっています。
そのため、phase2-3のtypaには"無治療"のフラグを立ててほしいです。

idが3の人は、idが2の人と同様に、phase2のtypaには"無治療"のフラグを立ててほしいです。
また、phase4-5のtypaはNAになっていますが、phase3のtypaは"A"を用いているため、
phase4のtypaには"中断", phase5のtypaには"無治療"のフラグを立ててほしいです。

非常に複雑で難しいですが、Rのコードをご教示頂けますと幸いです。
なお、idは複数人存在します。

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

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

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

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

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

meg_

2024/02/18 10:48

> 非常に複雑で難しいですが、Rのコードをご教示頂けますと幸いです。 何かの課題でしょうか?
iharayasutaka0

2024/02/18 10:51

meg_様 ご連絡ありがとうございます。課題ではございません。 個人的な研究として解析をやっております。
meg_

2024/02/18 11:49 編集

> 個人的な研究として解析をやっております。 そうでしたか。「~してほしい」という表現を多用されていたため課題等のコード作成依頼をされているのかと勘違いしてしまいました。失礼しました。
meg_

2024/02/18 15:13

> idが3の人は、idが2の人と同様に、phase2のtypaには"無治療"のフラグを立ててほしいです。 「idが3の人」はいないようですが。
guest

回答2

0

ベストアンサー

ひとまず無治療で埋めて、lag関数を活用して、一つ前が無治療やNA以外なら中断を入れる、という処理でいけると思います

library(tidyverse) data <- data.frame(id = c(rep(1, 5), rep(2, 5), rep(3, 5)), phase = c(rep(1:5,3)), tyra = c(c("A", "A", "A", NA, NA), c("無治療", NA, NA, "A", "A"), c("無治療", NA, "A", NA, NA))) data %>% replace_na(list(tyra = "無治療")) %>% # とりあえず無治療で埋める arrange(id, phase) %>% # lag関数を使う前準備としてソートしておく group_by(id) %>% mutate(lag_tyra = lag(tyra), # 1つ前のtyraを参照できるよう、lagをとる tyra_res = if_else(tyra == "無治療" & !is.na(lag_tyra) & lag_tyra != "無治療", "中断", tyra)) %>% ungroup() # 前行コメ: 無治療で、一つ前がNAでも無治療でもない場合には、中断に書き換える

投稿2024/02/19 09:22

cuttlefish44

総合スコア85

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

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

iharayasutaka0

2024/02/19 13:21

cuttlefish44様 ご回答いただきありがとうございました。 無事に解決することが出来ました。ありがとうございました。
guest

0

以下は purrr::accumulate() を利用する場合です。

r

1library(tidyverse) 2 3data <- data.frame( 4 id = c(rep(1, 5), rep(2, 5), rep(3, 5)), 5 phase = c(rep(1:5,3)), 6 tyra = c(c("A", "A", "A", NA, NA), 7 c("無治療", NA, NA, "A", "A"), 8 c("無治療", NA, "A", NA, NA))) 9 10# 11next_tyra <- setNames(c("中断", "無治療", "無治療"), c("A", "中断", "無治療")) 12data2 <- data %>% 13 group_by(id) %>% 14 mutate( 15 tyra = accumulate(tyra, ~ifelse(is.na(.y), next_tyra[last(.x)], .y)) 16 ) %>% 17 ungroup() 18 19data2 20 21# # A tibble: 15 × 3 22# id phase tyra 23# <dbl> <int> <chr> 24# 1 1 1 A 25# 2 1 2 A 26# 3 1 3 A 27# 4 1 4 中断 28# 5 1 5 無治療 29# 6 2 1 無治療 30# 7 2 2 無治療 31# 8 2 3 無治療 32# 9 2 4 A 33# 10 2 5 A 34# 11 3 1 無治療 35# 12 3 2 無治療 36# 13 3 3 A 37# 14 3 4 中断 38# 15 3 5 無治療

投稿2024/02/18 14:25

編集2024/02/19 16:21
melian

総合スコア19840

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

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

iharayasutaka0

2024/02/19 13:21

melian様 ご回答いただきありがとうございました。 id3の方の不備がございまして混乱を招いてしまい大変申し訳ございません。 ありがとうございました。
melian

2024/02/19 15:37

既に解決済ですが、purrr::accumulate() を使用するコードに書き換えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問