我有一个数据框,其中包含基于不同日期的名称重复的信息行。我想将此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")
感谢您的帮助。
答案 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