【问题标题】:Merge with if() statements in R与 R 中的 if() 语句合并
【发布时间】:2021-02-11 04:01:45
【问题描述】:

我正在尝试通过 STUDY_ID 查找数据集二。数据集 1 有 450,000 行具有唯一 STUDY-ID。数据集中的每个 STUDY_ID 都有一个 INDEX_DATE。数据集 2 有 2,000,000 行相同的 STUDY-ID,但有重复和不同的 ADMIT_TIME。数据集 2 有另一个变量 CARE_SETTING(编码为“I”/“O”/“E”/“U”)。

如果所有条目的 CARE_SETTING 相同(所有“I”、“O”等),然后为 CARE_SETTING 显示“I”、“O”等条目;如果是“O”、“I”、“E”、“U”的任何混合,则 CARE_SETTING 显示“I”,如果除“I”之外的任何其他组合,CARE_SETTING 显示“O”。

数据集 1 (df1)

STUDY_ID INDEX_DATE
1234 8-Oct-20
1235 13-Jul-20
1236 5-Jun-19
1237 18-Aug-20
1238 13-Jan-20
1239 12-Sep-20

数据集 2 (df2)(为了便于阅读,键入 * 表示日期等于 INDEX_DATE)

STUDY_ID ADMIT_TIME CARE_SETTING
1234 8-Oct-20* E
1234 8-Oct-20* O
1236 25-Feb-19 I
1236 28-Aug-20 I
1238 13-Jan-20* I
1238 13-Jan-20* O
1239 2-Feb-20 E
1239 12-Sep-20* O
1235 13-Jul-20* E
1235 13-Jul-20* E
1237 22-Mar-20 O
1237 12-Apr-20 I

所需数据集

STUDY_ID INDEX_DATE=ADMIT_TIME CARE_SETTING
1234 8-Oct-20 O
1235 13-Jul-20 E
1238 13-Jan-20 I
1239 12-Sep-20 O

【问题讨论】:

  • 1234如何得到“O”?它有两个值“E”和“O”。
  • O、E、U 的任意组合得到“O”。任何包含“I”的组合都会得到“I”。
  • 在你的帖子中你提到了any mixture of "O", "I", "E", "U", then show "I" for CARE_SETTING

标签: r if-statement merge vlookup


【解决方案1】:

通过'STUDY_ID' 加入两个数据集,并为每个STUDY_ID 使用case_when 决定CARE_SETTING 值:

library(dplyr)

df1 %>%
  inner_join(df2, by = c('STUDY_ID', 'INDEX_DATE' = 'ADMIT_TIME')) %>%
  group_by(STUDY_ID) %>%
  summarise(CARE_SETTING = case_when(n_distinct(CARE_SETTING) == 1 ~ first(CARE_SETTING), 
                                     any(CARE_SETTING %in% "O") ~ "O", 
                                     any(CARE_SETTING %in% "I") ~ "I")) -> result

【讨论】:

  • 首先,我需要处理 INDEX_DATE=ADMIT_TIME,你的方法没有解决这个问题
  • 您是否只想在STUDY_IDINDEX_DATE=ADMIT_TIME 匹配的地方检查CARE_SETTING?我已经更新了答案以相应地加入。我不清楚获得 CARE_SETTING 的“I”或“O”值的条件,因为您的帖子中的逻辑不同,cmets 不同,预期输出也不同。
  • 谢谢!它现在应该可以稍作修改。
  • 答案没有帮助。
猜你喜欢
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 2018-07-22
相关资源
最近更新 更多