gpt4 book ai didi

r - 按组选择每个连续运行中的第一行

转载 作者:行者123 更新时间:2023-12-05 08:37:10 29 4
gpt4 key购买 nike

我有按“ID”分组的数据。每个“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

我已经尝试了以下方法,但我无法使其工作,因为它会删除来自同一组但后来出现的那些药物,例如它会在 15/01/2020、17/02/2020 和 18/03/2020 下降,因为它只需要按组进行第一次观察。

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

最佳答案

使用data.table:

setDT(df)[rowid(rleid(drug)) == 1]
# ID date drug
# 1: 1 01/01/2020 A
# 2: 1 09/01/2020 B
# 3: 1 15/01/2020 A
# 4: 2 01/02/2020 C
# 5: 2 13/02/2020 D
# 6: 2 17/02/2020 C
# 7: 2 19/03/2020 E

如果应该在我们需要的每个“ID”中考虑“药物”的运行......

df[rowid(rleid(ID, drug)) == 1]

...处理以下情况:

   ID       date drug
1: 1 01/01/2020 A
2: 1 07/01/2020 A
3: 1 09/01/2020 B
4: 1 15/01/2020 B # This 'B' belongs to 2nd run in ID 1
5: 2 01/02/2020 B # This 'B' belongs to 1st run in ID 2
6: 2 13/02/2020 B
7: 2 17/02/2020 B
8: 2 18/03/2020 E
9: 2 19/03/2020 E

关于r - 按组选择每个连续运行中的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66376491/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com