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

如何解决按组选择每个连续运行中的第一行

我有按“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
,
df %>% filter(drug != lag(drug,default = ""))

或者,如果您想为一个 ID 保留第一个出现的药物,即使它与前一个 ID 的最后一个药物匹配(例如,假设 ID2 的第一个药物是 A,因此我们希望保留它。):>

df %>%
  filter(drug != lag(drug,default = "") |
           ID != lag(ID,default = 0))
,

base Rrle 一起使用

subset(df,with(rle(drug),!duplicated(rep(seq_along(values),lengths))))
,

希望此代码适用于您的一般情况

> subset(df,sequence(rle(drug)$lengths) == 1)
  ID       date drug
1  1 01/01/2020    A
3  1 09/01/2020    B
4  1 15/01/2020    A
5  2 01/02/2020    C
6  2 13/02/2020    D
7  2 17/02/2020    C
9  2 19/03/2020    E

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?