0

我有一个这样的数据框:

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 中可以有一个简短而优雅的解决方案。

4

2 回答 2

3

尝试类似的东西newdata <- data[!duplicated(data$id), ]

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

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

newdata <- testdata[!duplicated(testdata$id), ]
于 2012-10-04T01:12:11.330 回答
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.timeclass not POSIXct,但由于此解决方案是为了编码优雅,它应该就足够了。

于 2012-10-04T01:27:25.347 回答