【发布时间】:2021-11-30 09:09:49
【问题描述】:
我有一个有序事件记录集的数据框,它与具有唯一 id (grpid) 的组相关,其中记录是事件 (event),一个组 id 可能与一个或多个事件相关,但所有事件具有排名顺序变量(ordid)。 我要完成的任务是按照每个组中满足一组标准的事件顺序返回最早的事件。如果没有记录符合条件,只需返回最早的。我需要他们返回一个新的数据集。 因此,在 data.frame 'd' 中的最小可复制示例中,我的标准是返回每个组中不以 'x' 或 'y' 开头的第一个事件,但如果所有事件都以 x 或 y 开头,则返回接受第一个出现的记录,即使它是 x/y 记录。所以在“a”组的第一个事件中,d21 符合我的标准,所以我的新集合将包括“a”和“d21”。第二组有四个记录。前两个被拒绝,但选择了“b”“j10”,因为它是不以“x”或“y”开头的最低排名记录。在最后一种情况下,所有记录都以“x”或“y”开头,所以我只想要排名最低的“x10” 真实的数据集大约数亿,因此效率是一个考虑因素。下面提供了 MRE 的代码。
#make data.frame of sample data
grpid<-c('a','a','a','b','b','b','b','c','c')
ordid<-c(1,2,3,1,2,3,4,1,2)
event<-c('d21','e30','a10','x89','y77','j10','d17','x10','x22')
d<-data.frame(grpid,ordid,event)
d
#make data.frame of desired output
grpid1<-c('a','b','c')
event1<-c('d21','j10','x10')
out<-data.frame(grpid1,event1)
out
【问题讨论】: