我有一个180,000 x 400的数据框,其中每行对应一个用户,但每个用户恰好有两行。
id date ...
1 2012 ...
3 2010 ...
2 2013 ...
2 2014 ...
1 2011 ...
3 2014 ...
我想对数据进行子集处理,只保留每个用户最近的行(即每个id的日期值最高的行)。
我首先尝试使用 which()
循环 ids
,并在 sapply()
中使用 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),]
跑得非常快!!
filter
将保留所有现有列,但在出现平局的情况下允许多行;slice
将保留所有列,但在出现平局的情况下不返回多行;而summarise
将删除所有其他列,并且在出现平局的情况下不返回多行。这只是给那些以后看到这个问题的人提供信息。 - talatdplyr
大师,您可以自由地将这些解释添加到我的解决方案中。 - David Arenburg