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

标签 r dplyr group-by sequence

我有按“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/

相关文章:

r - 使用带逗号的 as.formula

c# - 如何在C#中从SQL Server获得唯一值

MySQL Count 和 Group By 两个不同的列

r - 如何使用dplyr基于字符串选择列

r - 计算行意味着无需提供列名称并根据每列总和有选择地删除列

python - Pandas groupby : get max value in a subgroup

r - 如何在 R studio 中将 .Rmd 转换为 .md?

r - 如何在 Shiny 中更改导航栏的颜色

r - 为什么 dplyr 的 top_n() 不起作用?

r - 如何更改 ggplot 中条形的对齐方式