如何保持改变的价值?

How to keep the changed value?

我在使用 lead() 处理值变化时遇到了问题。

df <- data.frame(id = c(11,11,11,11,12,12,12,12,13,13,13,13),
                 drug_type = c("A","A","B","C","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 %>%
  group_by(id) %>%
  filter(lead(drug_type)=="B")

但是,它只返回下一个值为“B”的相应行,而我还想保留包含更改值的行。比如11号病人,结果只返回了“2020-02-01”的记录,但是我希望想办法把“2020-03-01”的记录也保留下来, 即改变后的值.

我尝试了一些方法,包括创建名为“next”的额外列,显示药物类型中每个值的下一个值,但它们要么是错误的,要么是过于多余。因此,我想知道是否有更好的方法来实现我的目标。

您可以检查药物类型是否与 lead() 不同,或者药物类型是否与 lag()

不同
df %>%
  group_by(id) %>%
  filter(
    (drug_type!=lag(drug_type)) |
      drug_type!=lead(drug_type)
  )

输出:

     id drug_type drug_brand date      
  <dbl> <chr>          <dbl> <chr>     
1    11 A                  1 2020-02-01
2    11 B                  2 2020-03-01
3    11 C                  2 2020-03-13
4    13 A                  1 2021-02-27
5    13 B                  2 2021-03-22

如果您只想要更改为“B”的行加上具有新“B”值的行,您可以这样做:

df %>% group_by(id) %>% 
  filter((drug_type!="B" & lead(drug_type)=="B") | drug_type=="B" & lag(drug_type)!="B")

输出:

     id drug_type drug_brand date      
  <dbl> <chr>          <dbl> <chr>     
1    11 A                  1 2020-02-01
2    11 B                  2 2020-03-01
3    13 A                  1 2021-02-27
4    13 B                  2 2021-03-22