2017-07-22 2 views
2

Dies ist nur ein Beispieldatenrahmen.Holen Sie sich die letzten zwei Ereignisse einer ID und ordnen Sie sie an

enter image description here

Ich möchte die letzten beiden Veranstaltungen jeder id_num erhalten und eine andere Datenrahmen der id_num und die letzten beiden Veranstaltungen als Event1 und Event2 jeweils aus zu machen.

enter image description here

Wie kann es geschehen?

+3

Anstatt Bilder zu teilen, versuchen Sie, 'dput' von Ihrem Beispiel zu teilen, damit es anderen leicht fällt, zu helfen. –

Antwort

1

Dies kann in einer Zeile data.table mit erfolgen.

library(data.table) 
dt <- data.table(id_num = rep(1:3, 4), event = paste0("E", 1:12)) 
    #  id_num event 
    # 1:  1 E1 
    # 2:  2 E2 
    # 3:  3 E3 
    # 4:  1 E4 
    # 5:  2 E5 
    # 6:  3 E6 
    # 7:  1 E7 
    # 8:  2 E8 
    # 9:  3 E9 
    # 10:  1 E10 
    # 11:  2 E11 
    # 12:  3 E12 

dt[, .(event_1 = .SD[(.N-1), event], event_2 = .SD[.N, event]), by = id_num] 
    # id_num event_1 event_2 
    # 1:  1  E7  E10 
    # 2:  2  E8  E11 
    # 3:  3  E9  E12 
1

Eine Idee mit tidyverse Paket (mit @ Florians Datensatz),

library(tidyverse) 

df %>% 
group_by(id_num) %>% 
mutate(cnt = seq(n())) %>% 
slice((last(cnt)-1):last(cnt)) %>% 
spread(cnt, event) 

# A tibble: 2 x 3 
# Groups: id_num [2] 
# id_num `2` `3` 
#* <dbl> <fctr> <fctr> 
#1  1  E2  E3 
#2  2  E4  E5 
+0

Ups, meine Antwort war in der Tat falsch. Hier ist der Datensatz für Ihre Antwort: 'df = data.frame (id_num = c (1,1,1,2,2,2), event = c (" E1 "," E2 "," E3 "," E3 "," E4 "," E5 ")) – Florian

0

Sie können dies mit aggregate und tail in der Basis R tun.

do.call(data.frame, aggregate(event~id_num, data=df, tail, 2)) 
    id_num event.1 event.2 
1  1  E2  E3 
2  2  E4  E5 

Sie müssen auch do.calldata.frame auf das Ergebnis zu verwenden, da die Datenstruktur der Ausgabe von aggregate zweispaltigen data.frame ist, wo die zweite Säule aus Matrizen hergestellt wird. Nach dem do.call erhalten wir die gewünschte Struktur eines dreispaltigen Datenrahmens.

Verwandte Themen