R:独特(或dplyr distinct)+最近的约会

时间:2015-07-21 21:25:35

标签: r unique dplyr

我有一个数据框,其中包含基于不同日期的名称重复的信息行。我想将此df过滤为仅包含唯一名称的df,但如果有机会则选择最近出现的名称。我是dplyr的忠实粉丝,之前使用过distinct和select的组合,但是文档似乎不能单独使用它来完成:

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

这似乎是一个普遍会出现的问题,所以我想知道是否有人有任何建议。下面是一个示例df,它反映了我的真实数据将Names作为字符类,而Date作为POSIXct使用lubridate包生成。

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")

感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

最简单的方法是

DF %>% arrange(desc(Date)) %>% distinct(Name)

如果您真的希望名称保持相同的顺序,这些也可以使用(感谢@akrun):

DF %>% group_by(Name) %>% slice(which.max(Date))  # @akrun's better idea
DF %>% group_by(Name) %>% filter(Date==max(Date)) # my idea