2017-05-10 3 views
1

"id"と "date"の見出しを持つデータフレームがあります。各IDには複数の日付が入ります。例:ddplyを使用して各サブセットの最初のエントリを削除する

id date 
001 03/05/2000 
001 06/05/2001 
001 01/09/2002 
002 03/05/2000 
002 03/09/2004 
003 03/05/2000 
003 03/07/2001 
003 02/10/2002 

最初のエントリの行を削除したい(日付順)。だから私はで終わるしたい上記の例のために:

id date 
001 06/05/2001 
001 01/09/2002 
002 03/09/2004 
003 03/07/2001 
003 02/10/2002 

私はの線に沿って物事を試してみた:

reduced <- ddply(data, .(id), function(x) x[-1,]) 

運で。

どのように私はこれを効率的に行うことができますか?

問題は、IDに基づいてサブセットに分割し、最初の行を削除して(日付順)、最終的なデータフレームに再結合します。これは通常ddplyがうまくいくものですが、私は見えませんそれをここで働かせる。

答えて

0

効率の一部について

setDT(dat1)[,tail(.SD,-1),by="id"] 

は、私が上のマイクロベンチマークを実行しました4つのクエリとOP ' ddplyの質問。以下は10000で実行した場合の結果です。BaseRは、私が書いた方法で書いたクエリのほうが少し先です。より効率的なこれらのクエリを書く別の方法がある場合は、変更される可能性があります。誰かが私にそれを導くことができるかもしれません。おかげ

Unit: microseconds 
             expr  min 
    setDT(dat1)[, tail(.SD, -1), by = "id"] 1458.790 
dat1[duplicated(dat1$id, fromLast = F), ] 170.227 
dat1 %>% group_by(id) %>% do(tail(., -1)) 2014.897 
    ddply(dat1, .(id), function(x) x[-1, ]) 1667.238 
     lq  mean median  uq  max neval 
1644.247 1788.5900 1715.314 1805.304 24960.212 10000 
    230.614 263.3895 251.405 277.276 4469.816 10000 
2237.728 2490.9345 2329.737 2480.637 213565.874 10000 
1845.771 2027.1384 1910.950 2003.320 237116.650 10000 

出力:なぜdownvote

 id  date 
    <int>  <chr> 
1  1 06-May-01 
2  1 01-Sep-02 
3  2 03-Sep-04 
4  3 03-Jul-01 
5  3 02-Oct-02 
+0

?説明してください。間違いがある場合は、修正するか削除します。ありがとう – PKumar

0

dplyr溶液:

library(dplyr) 
data %>% group_by(id) %>% slice(-1) 

    id  date 
    <chr>  <chr> 
1 001 06/05/2001 
2 001 01/09/2002 
3 002 03/09/2004 
4 003 03/07/2001 
5 003 02/10/2002 

slice(-1)各グループの最初の行を削除します。

data.tableを使用して
dat1[duplicated(dat1$id,fromLast = F),] 

::私が注文したデータを持っていると仮定すると、BaseRを使用してdplyr:

dat1 %>% 
    group_by(id) %>% 
    do(tail(.,-1)) 

を使用して

0
data <- data[order(data$date),] 
data <- data[ duplicated(data$id),] 
関連する問題