我无法找到删除特定行的方法,其中ID相同但日期是最旧的。在示例中,我想删除第1行,因为ID与第2行相同,但日期较旧。
简单的例子:
id=c(1,1,2)
date=c("2012-01-01", "2014-01-01", "2014-04-06")
df <- data.frame(id, date)
由于 珍妮
答案 0 :(得分:3)
尝试duplicated
(假设&#34;日期&#34;列已订购)
df[!duplicated(df$id,fromLast=TRUE),]
# id date
#2 1 2014-01-01
#3 2 2014-04-06
或data.table
选项
df$date <- as.Date(df$date)
library(data.table)
setDT(df)[,if(.N>1) .SD[date!=min(date)] else .SD]
# id date
#1: 1 2014-01-01
#2: 2 2014-04-06
或者有效的方法(在@David Arenburg的帮助下)
unique(setorder(setDT(df), id, -date), by = "id")
# id date
#1: 1 2014-01-01
#2: 2 2014-04-06
或者
setorder(setDT(df), id, -date)[!duplicated(id)]
答案 1 :(得分:3)
这是一个dplyr解决方案:
> library(dplyr)
> df %>% group_by(id) %>% arrange(desc(date)) %>% slice(1)
Source: local data frame [2 x 2]
Groups: id
id date
1 1 2014-01-01
2 2 2014-04-06
编辑:@David Arenburg在下面的评论中提出了一种更简单(也更有效)的方法:
> df %>% arrange(id, desc(date)) %>% distinct(id)
请注意,这两个解决方案实际上都不会丢弃最旧的条目,而是选择最新的条目。