R 使用ddply删除每个子集的第一个条目

R 使用ddply删除每个子集的第一个条目,r,plyr,R,Plyr,我有一个标题为“id”和“date”的数据框,其中每个id可以有多个日期。例如: id date 001 03/05/2000 001 06/05/2001 001 01/09/2002 002 03/05/2000 002 03/09/2004 003 03/05/2000 003 03/07/2001 003 02/10/2002 我想删除第一个条目的行(按日期排序)。因此,对于上面的示例,我想以以下内容结束: id date 001 06/

我有一个标题为“id”和“date”的数据框,其中每个id可以有多个日期。例如:

id    date
001   03/05/2000
001   06/05/2001
001   01/09/2002
002   03/05/2000
002   03/09/2004
003   03/05/2000
003   03/07/2001
003   02/10/2002
我想删除第一个条目的行(按日期排序)。因此,对于上面的示例,我想以以下内容结束:

id    date
001   06/05/2001
001   01/09/2002
002   03/09/2004
003   03/07/2001
003   02/10/2002
我尝试了以下几点:

reduced <- ddply(data, .(id), function(x) x[-1,])

reduced
dplyr
解决方案:

library(dplyr)
data %>% group_by(id) %>% slice(-1)

     id       date
  <chr>      <chr>
1   001 06/05/2001
2   001 01/09/2002
3   002 03/09/2004
4   003 03/07/2001
5   003 02/10/2002
库(dplyr)
数据%>%分组依据(id)%%>%切片(-1)
身份证日期
1   001 06/05/2001
2   001 01/09/2002
3   002 03/09/2004
4   003 03/07/2001
5   003 02/10/2002

slice(-1)
删除每组的第一行。

dplyr
解决方案:

library(dplyr)
data %>% group_by(id) %>% slice(-1)

     id       date
  <chr>      <chr>
1   001 06/05/2001
2   001 01/09/2002
3   002 03/09/2004
4   003 03/07/2001
5   003 02/10/2002
库(dplyr)
数据%>%分组依据(id)%%>%切片(-1)
身份证日期
1   001 06/05/2001
2   001 01/09/2002
3   002 03/09/2004
4   003 03/07/2001
5   003 02/10/2002

切片(-1)
删除每组的第一行。

使用
dplyr:

dat1 %>% 
  group_by(id) %>% 
  do(tail(.,-1))
使用
BaseR
,假设我有一个有序的数据:

dat1[duplicated(dat1$id,fromLast = F),]
使用
数据。表

 setDT(dat1)[,tail(.SD,-1),by="id"]
关于效率部分,我对四个查询以及OP对ddply的查询运行了一个微基准。以下是运行时间=10000的结果。对于我以我编写的方式编写的查询来说,BaserDuplicated似乎没有什么进展。如果有其他更有效的方式来编写这些查询,它可能会有所改变,也许有人可以指导我。谢谢

Unit: microseconds
                                      expr      min
   setDT(dat1)[, tail(.SD, -1), by = "id"] 1458.790
 dat1[duplicated(dat1$id, fromLast = F), ]  170.227
 dat1 %>% group_by(id) %>% do(tail(., -1)) 2014.897
   ddply(dat1, .(id), function(x) x[-1, ]) 1667.238
       lq      mean   median       uq        max neval
 1644.247 1788.5900 1715.314 1805.304  24960.212 10000
  230.614  263.3895  251.405  277.276   4469.816 10000
 2237.728 2490.9345 2329.737 2480.637 213565.874 10000
 1845.771 2027.1384 1910.950 2003.320 237116.650 10000
输出:

     id      date
  <int>     <chr>
1     1 06-May-01
2     1 01-Sep-02
3     2 03-Sep-04
4     3 03-Jul-01
5     3 02-Oct-02
id日期
1 2006年5月1日
2001年9月21日
2004年9月3日至2日
2001年7月4日至3日
2002年10月5日至3日

使用
dplyr:

dat1 %>% 
  group_by(id) %>% 
  do(tail(.,-1))
使用
BaseR
,假设我有一个有序的数据:

dat1[duplicated(dat1$id,fromLast = F),]
使用
数据。表

 setDT(dat1)[,tail(.SD,-1),by="id"]
关于效率部分,我对四个查询以及OP对ddply的查询运行了一个微基准。以下是运行时间=10000的结果。对于我以我编写的方式编写的查询来说,BaserDuplicated似乎没有什么进展。如果有其他更有效的方式来编写这些查询,它可能会有所改变,也许有人可以指导我。谢谢

Unit: microseconds
                                      expr      min
   setDT(dat1)[, tail(.SD, -1), by = "id"] 1458.790
 dat1[duplicated(dat1$id, fromLast = F), ]  170.227
 dat1 %>% group_by(id) %>% do(tail(., -1)) 2014.897
   ddply(dat1, .(id), function(x) x[-1, ]) 1667.238
       lq      mean   median       uq        max neval
 1644.247 1788.5900 1715.314 1805.304  24960.212 10000
  230.614  263.3895  251.405  277.276   4469.816 10000
 2237.728 2490.9345 2329.737 2480.637 213565.874 10000
 1845.771 2027.1384 1910.950 2003.320 237116.650 10000
输出:

     id      date
  <int>     <chr>
1     1 06-May-01
2     1 01-Sep-02
3     2 03-Sep-04
4     3 03-Jul-01
5     3 02-Oct-02
id日期
1 2006年5月1日
2001年9月21日
2004年9月3日至2日
2001年7月4日至3日
2002年10月5日至3日

data
data为什么投反对票?请解释一下,如果有错误,我会更正或删除它。谢谢你为什么投反对票?请解释一下,如果有错误,我会更正或删除它。谢谢