2

我只是找不到删除特定行的方法,其中 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)

谢谢珍妮

4

2 回答 2

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)

请注意,这两种解决方案实际上都不会删除最旧的条目,而是选择最新的条目。

于 2015-02-16T11:39:03.423 回答
3

尝试duplicated(假设“日期”列是有序的)

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)]
于 2015-02-16T11:23:42.247 回答