2016-07-20 23 views
2

Ich habe vor kurzem den Pipe-Operator %>% entdeckt, die Code lesbarer machen kann. Hier ist meine MWE.R: Unterteilen Sie eine Auswahl mit der Pipe%>% und Platzhalter

library(dplyr)           # for the pipe operator 
library(lsr)           # for the cohensD function 

set.seed(4)            # make it reproducible 
dat <- data.frame(          # create data frame 
    subj = c(1:6), 
    pre = sample(1:6, replace = TRUE), 
    post = sample(1:6, replace = TRUE) 
) 

dat %>% select(pre, post) %>% sapply(., mean)   # works as expected 

Aber ich kämpfen, um das Rohr Operator in diesem speziellen Fall mit

dat %>% select(pre, post) %>% cohensD(.$pre, .$post) # piping returns an error 
cohensD(dat$pre, dat$post)        # classical way works fine 

Warum ist es nicht möglich, Spalten der Teilmenge der Platzhalter . in Kombination mit mit $? Lohnt es sich, diese Zeile mit einem Pipe-Operator %>% zu schreiben, oder kompliziert es die Syntax? Die klassische Schreibweise scheint prägnanter.

+0

Sie erhalten wahrscheinlich einen Fehler, weil der '%>%' Rohroperator die linke Seite als das erste Argument von die rechte Seite. Aber es scheint, dass die 'cohensD'-Funktion kein erstes Argument hat, das ein data.frame akzeptiert. IMO, es ist sauberer, dies in Basis-R-Syntax zu schreiben –

+1

Das würde funktionieren: 'dat%>% wählen (vor, nach)%>% {cohenD (. $ Pre,. $ Post)}'. Dadurch wird der letzte Aufruf als Ausdruck und nicht als Funktion behandelt. Wenn Sie etwas in einen Ausdruck pipen, wird das '.' wie erwartet ersetzt. Ich benutze diesen Trick oft, um eine Funktion aufzurufen, die nicht gut mit Rohrleitungen verbunden ist. –

Antwort

3

Da Sie aus einer Reihe von Daten in eine (Reihe von) Wert (en) gehen, fassen Sie zusammen. in einer dplyr Pipeline verwenden Sie können dann die summarise Funktion innerhalb der summarise Funktion, die Sie brauchen, um wie pre und post

nur rufen also nicht Teilmenge und kann:

dat %>% select(pre, post) %>% summarize(CD = cohensD(pre, post)) 

(Die select-Anweisung isn‘ t tatsächlich notwendig in diesem Fall, aber ich ließ es in, um zu zeigen, wie dies in einer Pipeline funktioniert)

+2

Ich denke, Sie müssen nicht explizit mit '$' Subtype; das sollte genug sein 'dat%>% summary (CD = cohenD (pre, post))' – Drey

+0

Sie haben völlig Recht, ich erinnerte mich, dass ich in einer Pipeline Subsetting verwendet hatte und war so konzentriert auf die Teilmenge arbeiten, ich didn denke nicht nur an die erste Stelle, danke! –

+0

Warum funktioniert es nicht mit der 'cohen.d' Funktion des' library (effsize) 'Pakets? 'dat%>% summarize (CD = cohen.d (pre, post))' gibt einen Fehler zurück. – piptoma

1

Es funktioniert nicht, weil der Operator . direkt als Argument verwendet werden muss, und nicht in einer geschachtelten Funktion (wie $...) in Ihrem Anruf.

Wenn Sie wirklich Rohrleitungen verwenden möchten, können Sie es mit der Formel Schnittstelle zu tun, aber mit ein wenig Umbildung vor (Schmelze aus reshape2 Paket):

dat %>% select(pre, post) %>% melt %>% cohensD(value~variable, .) 
#### [1] 0.8115027 
3

Dies funktionieren würde:

dat %>% select(pre, post) %>% {cohensD(.$pre, .$post)} 

Wenn Sie den letzten Anruf in geschweifte Klammern einschließen, wird er wie ein Ausdruck und kein Funktionsaufruf behandelt. Wenn Sie etwas in einen Ausdruck pipen, wird wie erwartet ersetzt. Ich benutze diesen Trick oft, um eine Funktion aufzurufen, die nicht gut mit Rohrleitungen verbunden ist.

Was innerhalb der geschweiften Klammern geschieht, ist ein Funktionsaufruf, könnte aber wirklich jeder Ausdruck von . sein.