2017-05-10 1 views
1

Ich habe ein Datenframe mit den Überschriften "ID" und "Datum", wobei jede ID mehrere Daten haben kann. Zum Beispiel:Entfernen der ersten Eintrag jeder Teilmenge mit 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 

Ich möchte die Zeile des ersten Eintrags (nach Datum sortiert) entfernen. So für das obige Beispiel würde ich will am Ende:

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

Ich habe Dinge versucht, entlang der Linien von:

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

ohne Glück.

Irgendwelche Ideen, wie ich das effizient machen könnte?

Das Problem ist es in Subsets basierend auf der ID zu brechen, die erste Zeile (nach Datum sortiert) und dann wieder in einen endgültigen Datenrahmen, was ddply normalerweise gut ist, aber ich kann nicht scheinen damit es hier funktioniert.

Antwort

0

Mit dplyr:

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

BaseR verwenden, Angenommen, ich habe eine Daten bestellt:

dat1[duplicated(dat1$id,fromLast = F),] 

data.table Verwendung:

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

Im Hinblick auf die Effizienz Teil, lief ich ein-Micro auf vier Abfragen zusammen mit OP ' s Abfrage von ddply. Unten ist das Ergebnis für das Laufen für = 10000. Es scheint, dass BaseR dupliziert ist wenig voraus für die Abfragen, die ich schrieb in der Art, wie ich schrieb. Es kann sich ändern, falls es andere Wege gibt, diese Abfragen zu schreiben, die effizienter sein können. Vielleicht kann mich jemand dazu führen. Dank

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 

Ausgang:

 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

Warum die downvote? Bitte erklären Sie, wenn es einen Fehler gibt, würde ich es entweder korrigieren oder löschen. Vielen Dank – PKumar

0

dplyr Lösung:

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) für jede Gruppe der ersten Reihe entfernt.

0
data <- data[order(data$date),] 
data <- data[ duplicated(data$id),] 
Verwandte Themen