R通过重复&选择

时间:2012-10-04 00:56:20

标签: r dataframe

我有一个这样的数据框:

id date               amt
1  2012-05-03 10:33   32
2  2012-06-01 12:49   242
2  2012-06-05 00:09   43
3  2012-06-03 05:19   323
3  2012-06-08 08:45   12
4  2012-06-09 12:38   32
5  2012-06-09 10:31   53

现在我想删除重复的id,以便选择具有最早日期的那个。重复条目的数量各不相同。我只关心每个特定id和相应amt的第一次出现,所有其他条目都应该删除。

我理解如何通过循环实现这一点,但我觉得R中可以有一个简短而优雅的解决方案。

2 个答案:

答案 0 :(得分:3)

尝试类似newdata <- data[!duplicated(data$id), ]的内容。

编辑:正如@Aaron和其他人在下面提到的那样,这假设您的数据已经排序:

testdata <- data[with(data, order(id, date)), ]

newdata <- testdata[!duplicated(testdata$id), ]

答案 1 :(得分:3)

使用data.table获得优雅的语法

library(data.table)

 datetime <- seq(as.POSIXct("2001-01-01"), as.POSIXct("2001-01-30"), l=7)    

DT <- data.table(id = c(1,2,2,3,3,4,5),x = datetime, amnt = sample(7))
DT
##    id                   x amnt
## 1:  1 2001-01-01 00:00:00    3
## 2:  2 2001-01-05 20:00:00    4
## 3:  2 2001-01-10 16:00:00    1
## 4:  3 2001-01-15 12:00:00    5
## 5:  3 2001-01-20 08:00:00    7
## 6:  4 2001-01-25 04:00:00    6
## 7:  5 2001-01-30 00:00:00    2

DT[, .SD[which.min(x)],by=id]
##    id                   x amnt
## 1:  1 2001-01-01 00:00:00    3
## 2:  2 2001-01-05 20:00:00    4
## 3:  3 2001-01-15 12:00:00    5
## 4:  4 2001-01-25 04:00:00    6
## 5:  5 2001-01-30 00:00:00    2

请注意,data.table会更喜欢IDate.time类不是POSIXct的密钥,但由于此解决方案适用于编码优雅,因此它就足够了。