我有以下数据集:
ID<-rep(c("A","B"),times=c(3,4))
Departure<-c("TRUE","FALSE","TRUE","TRUE","FALSE","FALSE","TRUE")
Date<-c("Jan 1","Jan 2","Jan 3","Jan 1","Jan 2","Jan 3","Jan 4")
data<-data.frame(ID,Departure,Date)
data
ID Departure Date
A TRUE Jan 1
A FALSE Jan 2
A TRUE Jan 3
B TRUE Jan 1
B FALSE Jan 2
B FALSE Jan 3
B TRUE Jan 4
我想使用以下两个条件来设置此数据集的子集:
1.数据集必须只保留和之后的行,包括“出发”列中最后一个FALSE值。
1.每个ID必须满足条件1。
生成的数据集如下所示:
ID Departure Date
A FALSE Jan 2
A TRUE Jan 3
B FALSE Jan 3
B TRUE Jan 4
关于如何做到这一点,最好使用dplyr的任何建议?
6条答案
按热度按时间slhcrj9b1#
碱R
ne5o7dgx2#
使用
data.table
的另一种方法注意我准备了你的数据,使用逻辑TRUE/FALSE,我使用日期而不是月日字符串。
数据
解决方案
首先,我们为每个ID提取您最近的FALSE记录的子集,然后将这些结果与最近日期的所有记录连接起来。
结果
扩展
如果您真的想获得原来的日期格式,只需在之后再次格式化它们
chy5wohz3#
这是一个有趣的挑战!我相信你可以想出更聪明的方法,但这是我的方法(使用
dplyr
):输出:
jyztefdp4#
您可以检查取反的Departure列的总和是否等于取反的Departure列的cumsum。请注意,示例数据中的此列是字符列,需要更改为逻辑列:
我不确定是否需要在过滤条件中使用
& any(!Departure)
,但这将确保只保留包含FALSE
值的组。vkc1a9a25#
这适用于您提供的数据,尽管我不确定它是否适用于其他示例(我不清楚ID周围的规则-所以您可能想检查一下,但它应该可以工作:
cfh9epnr6#
使用
rev
重置rle
by
ID。注意,如果Departure列为真布尔值,
它简化为