2016-05-25 7 views
1

Ich habe einen Datensatz wie folgt:Wie erstellt man Paare aus einer einzelnen Spalte basierend auf der Reihenfolge des Auftretens in R?

timestamp,session,event 
5/23/2016 13:00,1,A 
5/23/2016 13:20,1,B 
5/23/2016 13:40,1,C 
5/23/2016 14:00,2,B 
5/23/2016 15:00,2,C 
5/23/2016 15:20,3,B 
5/23/2016 15:40,3,C 
5/23/2016 16:00,3,D 

Ich versuche, geordnete Paare von Ereignissen innerhalb einer Sitzung nach dem Zeitstempel sortiert zu bauen. Mein Ziel ist es, eine Dateneingabe für sankey Diagramme zu bauen, die das folgende Format benötigt:

start,end,value 
A,B,1 
B,C,3 
C,D,1 

Ich habe dies nicht in der Lage gewesen, noch herauszufinden. Ich kann eine rekursive Abfrage innerhalb von sqldf verwenden. Aber fragte sich, ob es einen effizienteren Weg gibt, dies zu tun.

Es tut mir leid, dies ist das erste Mal, dass ich für Hilfe auf Stackoverflow posten und ich konnte nicht herausfinden, wie man das Dataset zeigt, also Bilder einfügen. Ich entschuldige mich für die Unannehmlichkeiten.

+0

versuchen können, ich denke, Sie alle Kombinationen benötigen. Versuchen Sie in diesem Fall mit '? Combn' – akrun

+1

Nein ... Ihre Bearbeitung hat es nur schwer lesbar gemacht; ( –

+0

Warum wird AC Kombination nicht benötigt? – akrun

Antwort

1

Mit dplyr:

library(dplyr) 
df <- cbind(dataset[1:nrow(dataset)-1,], dataset[2:nrow(dataset),]) 
names(df) <- c("timestamp1", "session1", "event1", "timestamp2", "session2", "event2") 

> df %>% filter(session1==session2) %>% count(event1, event2) 

Source: local data frame [4 x 3] 
Groups: event1 

    event1 event2 n 
1  A  B 1 
2  B  C 3 
3  C  D 1 
+0

CB sollte nicht im Ergebnis enthalten sein, da ich nur in der gleichen Sitzung nach geordneten Paaren suche – user6378693

+0

Es ist mir nicht klar, warum 'CB' weggelassen werden sollte. Können Sie das klären? –

+0

Ich suche nach Instanzen INNERHALB einer Sitzung, in der B nach C aufgetreten ist. Im obigen Dataset-Beispiel trat innerhalb einer Sitzung keine solche Instanz auf Ihre Lösung ist eine einfache Lösung - ich muss nur Zeilen für die Bedingung Sitzung == Sitzung filtern. Danke vielmals! – user6378693

3

Wir mit data.table

library(data.table) 
d1 <- na.omit(setDT(df1)[order(as.POSIXct(timestamp, format = '%m/%d/%Y %H:%M')) 
][, end := shift(event, type="lead"), session][]) 
d1[,.(value=.N) ,.(start=event, end)] 
# start end value 
#1:  A B  1 
#2:  B C  3 
#3:  C D  1 

Unter Verwendung der gleichen Methodik mit dplyr

library(dplyr) 
df1 %>% 
    arrange(as.POSIXct(timestamp, format = "%m/%d/%Y %H:%M")) %>% 
    group_by(session) %>% 
    mutate(end = lead(event)) %>% 
    na.omit() %>% 
    group_by(start=event, end) %>% 
    summarise(value = n()) 
#  start end value 
# <chr> <chr> <int> 
#1  A  B  1 
#2  B  C  3 
#3  C  D  1 
Verwandte Themen