2016-07-20 14 views
-1

Kürzlich stolperte ich uppon ein Problem, wo ich paarweise Unterschiede der Typen Compair müssen:"äußere" Operation mit dplyr/tidyr/purrr?

sometypes <- data.frame(id = rep(1:3, 2), 
         type = paste0("t", 1:6), 
         value1 = rnorm(6), 
         value2 = rnorm(6)) 

Hier würde Ich mag den Unterschied zwischen Wert1 und Wert2 auf ihre Art Basis zu berechnen. Ich fand heraus, inner_join zu verwenden:

#library(dplyr) 
inner_join(select(sometypes, - value2), 
      select(sometypes, - value1), by = c("id")) %>% 
    mutate(difference = value1 - value2) 

Da ich das eigentliche Beispiel, das ich vor einer Kette von Befehlen haben und danach Ich mag würde zu einer effizienten Nutzung der %>% Betreiber machen:

# ... imagine some operators before 
sometypes %>% 
    (function(ds) inner_join(select(ds, - value2), 
          select(ds, - value1), 
          by = c("id"))) %>% 
    mutate(difference = value1 - value2) 
# ... imagine many operators afterwards 

.. ., und ich würde gerne wissen, ob es übersichtliche Art und Weise ist es zu beschreiben, oder gibt es eine andere consice dieses Problem in dplyr lösen (vielleicht map2_df von purrr verwenden, aber wie?)

+0

ein Grund für einen Downvote? – Drey

Antwort

0

I g Ueß die ‚richtige‘ Art und Weise ist es, die . und geschweifte Klammern zu verwenden:

sometypes %>% 
    { inner_join(select(., - value2), 
      select(., - value1), 
      by = c("id")) } %>% 
    mutate(difference = value1 - value2) 

Dies ergibt sich aus Informationen darüber, wie der %>% Operator funktioniert. Sie können mehr darüber in der Dokumentation magrittr lesen. Insbesondere halten geschweifte Klammern die linke Seite davon ab, als erstes Funktionsargument verwendet zu werden, und Sie können direkt auf die linke Seite mit . verweisen.

+0

Danke, das hört sich vernünftig an, ändert aber nur die Syntax. Ich bin interessiert, ob es eine andere, mehr Consise Appraoch gibt. – Drey

+0

Ah ok, sorry, ich habe dich dann falsch verstanden. – Axeman