如何从具有重复rownames的数据框中删除一个特定行

时间:2015-02-16 11:19:24

标签: r dataframe rowname

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

由于 珍妮

2 个答案:

答案 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)

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