2015-07-21 82 views
3

我有一個數據幀組成的信息行,包括基於不同日期的名稱重複。我想將這個df過濾爲只包含唯一名稱的df,但如果有機會,也要選擇最近的發生。我是dplyr的忠實粉絲,並且之前使用過distinct和select的組合,但文檔似乎使得它不能單獨完成:R:Unique(或dplyr distinct)+最近的日期

「確定唯一性時使用的變量如果存在多行給定的輸入組合,只有第一行將被保留。「

這似乎是一個常見問題,所以我想知道是否有人有任何建議。下面是一個df示例,它反映了我的真實數據具有名稱作爲字符類,並且使用lubridate包生成了Date作爲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") 

謝謝您的幫助。

回答

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 
+1

謝謝。這很好 - 我不熟悉切片,所以我現在必須這樣做! –