【发布时间】:2015-02-16 12:20:56
【问题描述】:
我有一个 180,000 x 400 的数据框,其中的行对应于用户,但每个用户正好有两行。
id date ...
1 2012 ...
3 2010 ...
2 2013 ...
2 2014 ...
1 2011 ...
3 2014 ...
我想对数据进行子集化,以便只保留每个用户的最新行(即每个 id 的日期值最高的行)。
我首先尝试在sapply() 中使用which() 循环ids 和ifelse() 语句,这非常慢(我相信O(n^2))。
然后我尝试按id 对df 进行排序,然后以两个为增量循环并比较相邻日期,但这也很慢(我猜是因为R 中的循环是没有希望的)。两个日期的比较是瓶颈,因为排序几乎是即时的。
有没有办法对比较进行矢量化?
来自Remove duplicates keeping entry with largest absolute value的解决方案
aa <- df[order(df$id, -df$date), ] #sort by id and reverse of date
aa[!duplicated(aa$id),]
跑得很快!!
【问题讨论】: