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.timeクラスではなくクラスを優先することに注意してくださいPOSIXct。ただし、このソリューションはエレガンスをコーディングするためのものであるため、それで十分です。

于 2012-10-04T01:27:25.347 に答える