2016-07-08 24 views
1

我有一个数据帧(其中包括)一列唯一的ID和访问日期。数据帧对于每个ID有许多行。我想删除每个家庭ID前两个访问日期的所有行。根据日期删除每个唯一ID的前两个条目

感谢您的帮助!

编辑:这里是我工作的一个例子:

在该表中,我想删除行1-4,7-9,和11-14,因为它们都发生内第一每个ID的两个面试日期。

dates=as.Date(c("1/1/12","1/1/12","1/5/12","1/5/12","1/7/12","1/7/12","2/1/12","2/1/12","2/5/12","6/1/12","6/3/12","6/3/12","6/4/12","6/4/12","6/15/12","6/15/12"),format='%m/%d/%y') 
    hh_id=c(1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3) 
    df<-data.frame(hh_id,dates) 
    arrange(df,hh_id,desc(dates)) 


hh_id dates 
1  1 1/7/12 
2  1 1/7/12 
3  1 1/5/12 
4  1 1/5/12 
5  1 1/1/12 
6  1 1/1/12 
7  2 6/1/12 
8  2 2/5/12 
9  2 2/1/12 
10  2 2/1/12 
11  3 6/4/12 
12  3 6/4/12 
13  3 6/3/12 
14  3 6/3/12 
15  3 6/15/12 
16  3 6/15/12 
+3

请提供一些代码和'?你的数据dput'(可能只有几行(见'?head')) – loki

+0

感谢 - 我刚刚在 –

回答

3

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'ID'分组,我们order'date'并使用tail函数删除前两个观察值。

library(data.table) 
setDT(df1)[order(date), tail(.SD, -2) , by = ID] 

注:

1)假定的 '日期' 列作为Date类。如果不通过指定format(如果不在YYYY-MM-DD中)将Date类转换为as.Date

2)列名和对象名是虚构的。改变原来的列名/对象名称


根据在OP的帖子更新

setDT(df)[df[order(dates), .I[!(dates %in% dates[1:2])] ,hh_id]$V1] 
+0

以上的编辑中添加了它我期望删除所有具有前两个采访日期的行,而不是每个hh_id的前两行。抱歉,缺乏清晰度 - 我在编辑中修复了我的问题 –

+0

@AshleyThomas更新了帖子 – akrun

相关问题