2016-04-20 18 views
0

Ich habe folgenden Datenrahmen von Mausaktionen:Parsing Ereignisfolge in R-Datenrahmen

Timestamp1, Timestamp2, button, state, x, y 
49.8709998131,49.7949999999,NoButton,Move,498,580 
49.8709998131,49.8730000001,Left,Pressed,498,580 
49.9659998417,49.983,Left,Released,498,580 
50.1739997864,50.1850000001,NoButton,Move,497,580 
50.7269999981,50.7310000001,NoButton,Move,495,581 
51.8219997883,51.7140000002,NoButton,Move,569,617 
51.8229999542,51.8390000002,NoButton,Move,633,642 
52.0539999008,51.8390000002,NoButton,Move,654,650 
52.0539999008,51.9329999997,NoButton,Move,719,666 
52.0539999008,52.057,NoButton,Move,761,666 
52.1819999218,52.1979999999,NoButton,Move,763,663 
52.5659999847,52.5720000002,NoButton,Move,763,659 
52.6779999733,52.6809999999,NoButton,Move,778,658 
52.893999815,52.6809999999,NoButton,Move,783,656 
52.8949999809,52.8999999999,NoButton,Move,799,650 
53.0549998283,53.0559999999,NoButton,Move,800,649 
53.2349998951,53.2429999998,NoButton,Move,805,645 
53.2349998951,53.2429999998,Left,Pressed,805,645 
53.3509998322,53.2590000001,NoButton,Drag,807,644 
53.3509998322,53.352,Left,Released,807,644 
53.8619999886,53.8670000001,NoButton,Move,808,644 
53.9739999771,53.9759999998,NoButton,Move,809,645 
54.0779998302,54.085,NoButton,Move,802,686 
54.1899998188,54.085,NoButton,Move,802,691 
54.1909999847,54.1949999998,NoButton,Move,796,728 
54.3019998074,54.304,NoButton,Move,795,745 
54.4069998264,54.4130000002,NoButton,Move,796,756 
54.5629999638,54.5529999998,NoButton,Move,801,766 
54.751999855,54.7250000001,NoButton,Move,803,766 
54.8379998207,54.8500000001,NoButton,Move,807,766 
54.8389999866,54.8500000001,Left,Pressed,807,766 
54.9709999561,54.9750000001,NoButton,Drag,808,766 
54.9709999561,54.9750000001,Left,Released,808,766 
55.3819999695,55.3960000002,NoButton,Move,809,766 
55.5979998112,55.4890000001,NoButton,Move,801,760 
55.5989999771,55.6140000001,NoButton,Move,790,752 

Ich mag spezifische Teilfolgen analysieren, wie Linksklick:

49.8709998131,49.8730000001,Left,Pressed,498,580 
49.9659998417,49.983,Left,Released,498,580 

oder Drag & Drop, wie:

53.2349998951,53.2429999998,Left,Pressed,805,645 
53.3509998322,53.2590000001,NoButton,Drag,807,644 
53.3509998322,53.352,Left,Released,807,644 

oder reine Mausbewegungen ohne Unterbrechung durch Klicks mag:

52.5659999847,52.5720000002,NoButton,Move,763,659 
52.6779999733,52.6809999999,NoButton,Move,778,658 
52.893999815,52.6809999999,NoButton,Move,783,656 
52.8949999809,52.8999999999,NoButton,Move,799,650 
53.0549998283,53.0559999999,NoButton,Move,800,649 
53.2349998951,53.2429999998,NoButton,Move,805,645 

Mein heuristischer Weg besteht darin, über die gesamte Sequenz mit einer for-Schleife zu iterieren und jedes Element vor und nach dem tatsächlichen Element zu untersuchen, abhängig von den spezifischen Details der gewünschten Untersequenz. Das scheint auf der einen Seite sehr mühselig zu sein und passt nicht zu Rs ansonsten eleganten, auf die Anwendung abgestimmten kurzen Lösungen. Könnte jemand professioneller vorschlagen?


Ich denke, ich wiederhole das Problem auf eine allgemeinere Art und Weise. In Anbetracht der folgenden Datenrahmen:

Timestamp, State1, x, y 
50.1739997864,a,497,580 
50.7269999981,a,495,581 
51.8219997883,a,569,617 
51.8229999542,b,633,642 
52.0539999008,b,654,650 
52.0539999008,a,719,666 
52.0539999008,a,761,666 
52.1819999218,b,763,663 
52.5659999847,c,763,659 
52.6779999733,b,778,658 
52.893999815,a,783,656 
52.8949999809,a,799,650 
53.0549998283,b,800,649 
53.2349998951,a,805,645 
53.2349998951,b,805,645 
53.3509998322,b,807,644 

Wie man Antworten auf die Fragen erhalten könnte wie: - Was sind die Untergruppen mit kontinuierlichen State1 == sind „a“ Reihen? - Welches sind die Teilmengen mit Anfang und Ende einer Zeile mit State1 == "a" und mindestens eine Zeile mit State1! = "A" zwischen ihnen? - Was ist die verstrichene Zeit/Euklidische Entfernung zweier benachbarter Reihen, wo im ersten Fall State1! = "A" und im zweiten Fall State1 == "b"?

+1

Wäre schön, genauer zu wissen, was Ihre gewünschte Leistung wäre. Möchten Sie einen Vektor mit Zeichenfolgen, die "Verschieben, Linksklick, Verschieben, Drag Drop, Verschieben, Drag Drop, Verschieben" lauten? – Antares42

+0

Lesen Sie zuerst Ihre Daten mit 'read.csv' ein, so dass Sie eine Untermenge bilden können. Es kann sich lohnen, eine Indexspalte ('df $ id <- seq_along (df $ Timestamp1) ') hinzuzufügen, damit Sie erkennen können, ob Ereignisse aufeinander folgen; 'data.table :: rleid' kann ebenfalls hilfreich sein. Wirklich, es ist schwer, Ihnen eine gute Antwort zu geben, ohne uns zu sagen, wie es aussehen soll. – alistaire

+0

Sie könnten [diesen Beitrag] (http://stackoverflow.com/questions/33027611/how-to-index-a-vector-sequence-within-a-vector-sequence) hilfreich finden. Verwenden Sie eine der Funktionen dort -say 'FUN' - wie' schneiden (FUN (c ("Links", "NoButton", "Left"), as.character (DF $ button)), FUN (c ("gedrückt" , "Drag", "Released"), as.character (DF $ state))) gibt die Startzeilenpositionen Ihres spezifischen Musters an. –

Antwort

0

Schleifen würde funktionieren, könnte aber langsam sein. Es ist ein schneller Ansatz, zum Beispiel

df$state[-nrow(df)] == "Left,Pressed" & df$state[-1] == "Left,Released" 

Dies macht eine logische Vektor, den die Position des Zeigen „links gedrückt“, dass in die unmittelbar gefolgt von einer „links, freigegeben“

ähnlicher Code würde für die Arbeit Drag & Drop. Für die Mausbewegung könnte rle() nützlich sein.