【发布时间】:2021-02-25 21:11:55
【问题描述】:
我有按“ID”分组的数据。每个“身份证”在不同的日期都有不同的药物。在“药物”的每次连续运行中,我只想保留第一行。这应该按组完成,即在每个“ID”内。数据中显示了两个例子:
ID date drug
1 01/01/2020 A # first row in run 1 of 'A' for ID 1: keep
1 07/01/2020 A # 2nd row in run 1 of 'A' for ID 1: drop
1 09/01/2020 B
1 15/01/2020 A
2 01/02/2020 C
2 13/02/2020 D
2 17/02/2020 C # first row in run 2 of 'C' of ID 2: keep
2 18/03/2020 C # 2nd row in run 2 of 'C' of ID 2: drop
2 19/03/2020 E
期望的输出:
ID date drug
1 01/01/2020 A
1 09/01/2020 B
1 15/01/2020 A
2 01/02/2020 C
2 13/02/2020 D
2 17/02/2020 C
2 19/03/2020 E
我尝试了以下方法,但我无法使其发挥作用,因为它会删除那些来自同一组但稍后出现的药物,例如它会在 2020 年 1 月 15 日、2020 年 2 月 17 日和 2020 年 3 月 18 日下降,因为它只需要按组进行第一次观察。
df_selection <- df %>%
group_by(ID) %>%
arrange(ID,date) %>%
group_by(ID, drug) %>%
slice(1L) %>%
arrange(ID,date)
我尝试了很多组合,但我无法让它发挥作用。非常感谢您的帮助!
另外一个例子说明一个“ID”中的最后一个“药物”与下一个“ID”中的第一个相同,这里是药物“B”:
ID date drug
1 01/01/2020 A
1 07/01/2020 A
1 09/01/2020 B # first row in a run of 'B' for ID 1: keep
1 15/01/2020 B # 2nd row in a run of 'B' for ID 1: drop
2 01/02/2020 B # first row in a run of 'B' for ID 2: keep
2 13/02/2020 B # 2nd: drop
2 17/02/2020 B # 3rd: drop
2 18/03/2020 E
2 19/03/2020 E
【问题讨论】:
-
如果药物 A 是 ID1 的最后一个 obs 并且它也是 ID2 的第一个 obs 怎么办?留着它?到目前为止,一些答案都依赖于 ID2 以不同于 ID1 结尾的药物开始的条件。
-
@JonSpring 实际上,我想我们应该考虑运行 within 'id'。问题中没有明确说明,但代码可能会这样建议。