當我使用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”的額外列,顯示藥物型別中每個值的下一個值,但它們要么錯誤,要么過度冗余。因此,我想知道是否有更好的方法來實作我的目標。
uj5u.com熱心網友回復:
您可以檢查藥物型別是否不同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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/464501.html
