R:Uniques(或dplyr distinct)和#x2B;最近日期

R:Uniques(或dplyr distinct)和#x2B;最近日期,r,unique,dplyr,R,Unique,Dplyr,我有一个数据框架,它由信息行组成,其中包括基于不同日期的名称的重复。我想将这个df过滤成一个只包含唯一名称的df,如果有机会,还可以选择最近发生的df。我是dplyr的忠实粉丝,以前使用过distinct和select的组合,但文档表明,单靠它是无法做到这一点的: 确定唯一性时使用的变量。如果给定的输入组合有多行,则只保留第一行 这似乎是一个经常发生的问题,所以我想知道是否有人有任何建议。下面是一个示例df,它反映了我的真实数据的名称是字符类,日期是我使用lubridate包生成的POSIXct

我有一个数据框架,它由信息行组成,其中包括基于不同日期的名称的重复。我想将这个df过滤成一个只包含唯一名称的df,如果有机会,还可以选择最近发生的df。我是dplyr的忠实粉丝,以前使用过distinct和select的组合,但文档表明,单靠它是无法做到这一点的:

确定唯一性时使用的变量。如果给定的输入组合有多行,则只保留第一行

这似乎是一个经常发生的问题,所以我想知道是否有人有任何建议。下面是一个示例df,它反映了我的真实数据的名称是字符类,日期是我使用lubridate包生成的POSIXct

structure(list(Name = c("John", "John", "Mary", "John", "Mary", 
"Chad"), Date = structure(c(1430438400, 1433116800, 1335830400, 
1422748800, 1435708800, 1427846400), tzone = "UTC", class = c("POSIXct", 
"POSIXt"))), .Names = c("Name", "Date"), row.names = c(NA, -6L
), class = "data.frame")
预期的结果是:

structure(list(Name = c("John", "Mary", "Chad"), Date = structure(c(1433116800, 
1435708800, 1427846400), class = c("POSIXct", "POSIXt"), tzone = "UTC")), .Names = c("Name", 
"Date"), row.names = c(2L, 5L, 6L), class = "data.frame")

谢谢你的帮助

最简单的方法是

DF %>% arrange(desc(Date)) %>% distinct(Name)
如果您真的希望名称保持相同的顺序,那么这些也可以使用(感谢@akrun):


非常感谢。这非常有效-我不熟悉slice,所以我现在必须这么做!
DF %>% group_by(Name) %>% slice(which.max(Date))  # @akrun's better idea
DF %>% group_by(Name) %>% filter(Date==max(Date)) # my idea