根据日期和另一个字段,在R数据框中删除重复行

6

我刚接触R语言,正在学习如何处理数据库数据,但遇到了问题。

我想根据两个条件从表格中删除重复的行/记录:一个用户ID字段和一个日期字段,该字段指示最近更改用户的时间,因此是最新日期的行。

我的缩小后的数据集应如下所示:

UID    | DateLastChange
1      |  01/01/2016
1      |  01/03/2016
2      |  01/14/2015
3      |  02/15/2014
3      |  03/15/2016

我希望最终得到:

UID    | DateLastChange
1      |  01/03/2016
2      |  01/14/2015
3      |  03/15/2016

我尝试使用重复或唯一,但它们似乎不完全支持选择性。我能构想出建立一个新表格的可能性,其中包括唯一的UID,然后通过左连接的方式仅匹配最近的日期。

如有建议,将不胜感激。 Scott


2
如果按照所示的顺序执行,这只是一个“重复”操作 - dat[!duplicated(dat$UID, fromLast=TRUE),] - thelatemail
感谢您对帖子的编辑。正如您所看到的,那是我在SO上的第一篇帖子,所以我还没有弄清楚如何制作整洁的表格。谢谢。SW。 - Scottieie
2个回答

6
我们可以使用data.table
library(data.table)
setDT(df1)[order(UID, -as.IDate(DateLastChange, "%m/%d/%Y")), head(.SD, 1), by = UID]
#     UID DateLastChange
#1:   1     01/03/2016
#2:   2     01/14/2015
#3:   3     03/15/2016

或者使用 duplicated

setDT(df1)[order(UID, -as.IDate(DateLastChange, "%m/%d/%Y"))][!duplicated(UID)]

这是否适用于随机排序的DateLastChange条目,还是它们必须按照OP示例中的时间顺序排列? - questionmark
1
@questionmark 在 i 中,我们将列'DateLastChange'转换为Date类后进行了排序。它应该适用于随机排序。唯一需要更改的是格式%m/%d/%Y,如果不是按月/日/年的顺序排列。 - akrun
1
那很有道理!谢谢@akrun! - questionmark

1
使用dplyr - 数据可以是任何顺序
require(dplyr)
dat$DateLastChange <- strptime(dat$DateLastChange, "%m/%d%Y")) 
dat %>% group_by(UID) %>% summarize(DateLastChange = max(DateLastChange))

Epi99,感谢您的快速回复。它返回一个错误,指示日期格式不正确。"Error in grouped_df_impl(data, unname(vars), drop) : column 'EmploymentStatusChangeDate' has unsupported class : POSIXlt, POSIXt. 我尝试找到一种将其指定为POSIXct的方法,但尚未找到适当的用法。我看到您正在努力解决这个问题,我也会继续努力。 - Scottieie
您的样本数据是纯文本格式 - 因此,strptime()函数用于将文本日期格式解析为datetime对象,以便max()函数可以进行有效比较。如果您的数据框已经是日期或时间格式,则不需要包含strptime()函数的那一行。这就是为什么通常建议使用dput函数来显示示例数据 - 然后您的读者可以完全重现您的数据。 - Andrew Lavers
我将探索dput,以便我们可以在数据上进行相同的苹果/苹果比较。昨天我已经成功将日期从字符转换为日期,并且max()比较实际上也起作用了,所以谢谢你。 - Scottieie
这仅适用于给定的示例,但是如果您有其他要使用的列,则应改用过滤器:dat%>% group_by(UID)%>% filter(Date == max(Date)) - Leo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接