我有一个这样的数据框:
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中可以有一个简短而优雅的解决方案。
答案 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
的密钥,但由于此解决方案适用于编码优雅,因此它就足够了。