2016-08-12 5 views
1

Ich möchte die letzte Zeile in einem Datenrahmen für jede Gruppe in R basierend auf max (start_date) löschen.R letzte Zeile im Datenrahmen für jede Gruppe löschen

Beispieldaten:

id  start_date end_date 
1  2016-01-14 2016-02-14 
1  2016-03-14 2016-08-05 
2  2014-01-14 2014-02-14 
2  2015-03-21 2015-05-21 
2  2015-08-23 2015-09-23 
2  2015-11-21 2016-01-03 

Ergebnis:

id  start_date end_date 
1  2016-01-14 2016-02-14 
2  2014-01-14 2014-02-14 
2  2015-03-21 2015-05-21 
2  2015-08-23 2015-09-23 

Die folgende funktioniert nicht:

df <- df %>% 
    group_by(id) %>% 
    summarise(start_date != max(start_date)) 

Fehler: gefunden dupliziert Spaltenname: id

df <- sqldf("select * from df group by id having start_date != max(start_date)") 

Fehler in der Aussage: doppelte Spalte Name: ID

Alle Vorschläge wäre großartig.

+2

uns e 'filter()' anstelle von 'summarize()' – mtoto

+0

Verwenden Sie in SQL eine korrelierte Abfrage: 'sqldf (" * "aus df a wählen where start_date nicht in (wählen Sie max (start_date) aus df b wobei b.id = a. id) ")' –

Antwort

2

Wir verwenden slice (unter der Annahme, dass die Daten bereits bestellt werden)

df1 %>% 
    group_by(id) %>% 
    slice(-n()) 
#  id start_date end_date 
# <int>  <chr>  <chr> 
#1  1 2016-01-14 2016-02-14 
#2  2 2014-01-14 2014-02-14 
#3  2 2015-03-21 2015-05-21 
#4  2 2015-08-23 2015-09-23 

Wenn die Daten nicht bestellt werden, dann arrange und slice

df1 %>% 
    group_by(id) %>% 
    arrange(start_date) %>% 
    slice(-n()) 

Basierend auf einigen früheren Benchmarks (couldn‘ t finden Sie den Link), die arrange/slice Methode wäre schneller als der Vergleich start_date != max(start_date)

+1

'df1 [, Kopf (.SD, -1), durch =. (id)]' alternativ – Chris

Verwandte Themen