如何识别 R 中一列的值变化?

How to identify value change in one column in R?

我计划识别并提取经历过从旧药到新药的药物变化的受试者。 在下面的代码中,有两种药物:A和B,A类是老药,B类是新药,B有不同的药牌:2,3和4。
每个人随着时间的流逝,药物变化有3种模式:

  1. 11号患者将药物从A型改为B型,只有A型和B型可以,B型改为A型不算改变

  2. 患者 12 一直使用 B 型,但他从品牌 2 更改为品牌 3。

  3. 患者 13 从 A 型变为 B 型,但他再次从品牌 2 变为品牌 3。

    df <- data.frame(id = c(11,11,11,11,12,12,12,12,13,13,13,13),
                  drug_type = c("A","A","B","B","B","B","B","B","A","A","B","B"),
                  drug_brand = c(1,1,2,2,2,3,3,3,1,1,2,3),
                  date = c("2020-01-01","2020-02-01","2020-03-01","2020-03-13",
                           "2019-04-05","2019-05-02","2019-06-03","2019-08-04",
                           "2021-02-02","2021-02-27","2021-03-22","2021-04-11"))
     df$date <- as.Date(df$date)
    

那么我应该如何从这个数据集中筛选出换药的患者呢?
为了解决这个问题,我在两个数据框中总结了 A 类药物的最后使用日期和 B 类药物的首次使用日期。我在内部加入了 id 和过滤器,条件是类型 B 的第一个日期晚于类型 A 的最后一个日期,但这可能只能解决从类型 A 到类型 B 的变化。我不知道如何识别所有药物变化的模式。

我还没有找到任何解决方案或类似的问题,所以我真诚地希望你能与我分享你的想法。谢谢你的时间。

您的最终目标是否只是过滤掉任何更改了 drug_branddrug_type 的主题?如果是这样,您可以使用带 dplyr::n_distinct() 的分组过滤器来删除具有 >1 个品牌或 >1 类型的主题:

library(dplyr)

df %>%
  group_by(id) %>%
  filter(
    n_distinct(drug_type) == 1,
    n_distinct(drug_brand) == 1
  ) %>%
  ungroup()

也许您可以查看 drug_type 从“A”到“B”的过渡,或者包括不同 drug_brand 的数量大于 1 的地方?

library(tidyverse)

df %>%
  group_by(id) %>%
  filter(any(drug_type == "B" & lag(drug_type) == "A") |
           n_distinct(drug_brand) > 1)