如何保持改变的价值?
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
我在使用 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