LoginSignup
sugisugi0712
@sugisugi0712

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

[R]特定の日付の範囲に合致するデータのみを結合する方法

Rで以下のような二つのデータを結合したいと考えています。

データ①
個体ID 分娩日 分娩後10日
A 2023/1/1 2023/1/11
B 2023/1/2 2023/1/12
C 2023/1/3 2023/1/13
D 2023/1/2 2023/1/12
E 2023/1/4 2023/1/14

データ②
個体ID 診断日  病気有無
A 2023/1/9 1
A 2023/2/2 1
C 2023/1/12 1
E 2023/3/3 1

データ①にデータ②の情報を加えたいのですが、以下の条件を満たすもののみを抽出して結合したいです。
条件1:個体IDが一致
条件2:データ②の診断日の日付が、データ①の分娩日から分娩10日の範囲のもの

ゴールのイメージは以下のようなデータフレームを作成することです。
個体ID 分娩日 分娩後10日 疾病有無
A 2023/1/1 2023/1/11 1
B 2023/1/2 2023/1/12 0
C 2023/1/3 2023/1/13 1
D 2023/1/2 2023/1/12 0
E 2023/1/4 2023/1/14 0

ご教授いただけますと幸いです。

0

1Answer

以下未検証ですが参考までに

library(dplyr)
library(lubridate)

# データ①
data1 <- data.frame(
  個体ID = c("A", "B", "C", "D", "E"),
  分娩日 = as.Date(c("2023-01-01", "2023-01-02", "2023-01-03", "2023-01-02", "2023-01-04")),
  分娩後10日 = as.Date(c("2023-01-11", "2023-01-12", "2023-01-13", "2023-01-12", "2023-01-14"))
)

# データ②
data2 <- data.frame(
  個体ID = c("A", "A", "C", "E"),
  診断日 = as.Date(c("2023-01-09", "2023-02-02", "2023-01-12", "2023-03-03")),
  病気有無 = c(1, 1, 1, 1)
)

# データの結合
merged_data <- merge(data1, data2, by = "個体ID", all.x = TRUE)

# 条件に基づくフィルタリング
filtered_data <- merged_data %>%
  mutate(病気有無 = ifelse(診断日 >= 分娩日 & 診断日 <= 分娩後10日, 病気有無, 0)) %>%
  group_by(個体ID) %>%
  summarize(分娩日 = first(分娩日), 分娩後10日 = first(分娩後10日), 病気有無 = max(病気有無))

# 結果の表示
filtered_data
1

Comments

  1. @sugisugi0712

    Questioner

    ありがとうございます!できました。Chat gptはここまで答えてくれるのですね。

  2. よかったです.有料版の動作ですが,質問者のようにちゃんと要件を定義した内容を与えればちゃんと動作してくれます.という非常に良い例になったかと思います.
    ChatGPTにはCode Interpreterという有料版限定機能がありまして,Pythonで何かしら解析することを目的に動作する機能なのですが,Rで実現したい実装を一旦Pythonで書いてみてデータフレームの動作検証,その後Rに翻訳という流れでコードを示してくれたようです(文面最下部の青いモーダルボタンでPython実装を見れます).

  3. 解決したようでしたら、質問をクローズにするといいですよ。

  4. @sugisugi0712

    Questioner

    そのような機能があるのですね。大変参考になりました。ありがとうございます。

    ご指摘ありがとうございます。クローズいたしました。

Your answer might help someone💌