2016-07-28 12 views
0

Ich habe einen Datenrahmen mit Clickstream-Daten. Mich interessiert, was genau vor und nach bestimmten Ereignissen passiert ist, die durch einen booleschen Ausdruck definiert wurden, der mehrere Spalten enthält - dh ich würde bei einem booleschen Ausdruck eine Teilmenge des ursprünglichen Datenrahmens ausgeben, der 10 Zeilen darüber und darunter enthält jede Zeile erfüllt den Ausdruck. Gibt es dafür einen eleganten Weg, zum Beispiel mit dplyr?"Untersuchen" Subsetting-Funktion

Hinzufügen eines reproduzierbaren Beispiel:

df <- data.frame(col1 = c(rep("a",20), rep("b",20)), col2 = c(1:20, 1:20))

look_around(df, col1 == "a" & col2 %in% c(17,20)) produzieren sollte df[7:30,]

die Funktion look_around schreiben.

+0

Sie irgendeine Art von [reproduzierbarem Beispiel] (http bieten sollten: // stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) mit Beispieleingabe und gewünschter Ausgabe, um Ihnen zu helfen, einfacher zu helfen. – MrFlick

Antwort

2

Dies scheint eine Variation auf subset, so dass ich angepasst folgende von subset:

look_around <- function(data, condition, before=10, after=10) { 
    # Set default values for `before` and `after` to 10 
    e <- substitute(condition) 
    r <- eval(e, data, parent.frame()) 
    rows <- unique(as.vector(sapply(which(r), function(x) { 
     (x-before):(x+after) 
    }))) 
    rows <- rows[rows > 0 & rows <= nrow(data)] 
    data[rows,] 
} 

Ausgang:

> df <- data.frame(col1 = c(rep("a",20), rep("b",20)), col2 = c(1:20, 1:20)) 
> look_around(df, col1 == "a" & col2 %in% c(17,20), before=10, after=10) 
    col1 col2 
7  a 7 
8  a 8 
9  a 9 
<snip> 
30 b 10 
+0

Das OP weiß vielleicht nichts über das Setzen von Standardwerten in einer Funktionsdefinition, also könnte es auch anzeigen, wie 'function (data, condition, before = 10, after = before)' – Frank

Verwandte Themen