2016-03-28 16 views
5

Czy ktoś wie o szybki sposób, aby wybrać kolumny "all-but-one" (lub "all-a-few") podczas korzystania z dplyr::group_by? Koniec końców, chcę po prostu zebrać kilka różnych kolumn, ale nie chcę za każdym razem jawnie wymieniać wszystkich kolumn grupowania (ponieważ te są dodawane i usuwane często w mojej analizie).wybierz operator minus w dplyr group_by

Przykład:

> df <- data_frame(a = c(1,1,2,2), b = c("foo", "foo", "bar", "bar"), c = runif(4)) 
> df 
Source: local data frame [4 x 3] 

     a  b   c 
    (dbl) (chr)  (dbl) 
1  1 foo 0.95460749 
2  1 foo 0.05094088 
3  2 bar 0.93032589 
4  2 bar 0.40081121 

Teraz chcę agregowanie przez a i b, więc mogę to zrobić:

> df %>% group_by(a, b) %>% summarize(mean(c)) 
Source: local data frame [2 x 3] 
Groups: a [?] 

     a  b mean(c) 
    (dbl) (chr)  (dbl) 
1  1 foo 0.5027742 
2  2 bar 0.6655686 

Wielki. Ale ja bym naprawdę lubią być w stanie zrobić coś takiego właśnie określenia niec, podobny do dplyr::select(-c):

> df %>% select(-c) 
Source: local data frame [4 x 2] 

     a  b 
    (dbl) (chr) 
1  1 foo 
2  1 foo 
3  2 bar 
4  2 bar 

Ale group_by można zastosować wyrażenia, więc odpowiednik nie działa:

> df %>% group_by(-c) %>% summarize(mean(c)) 
Source: local data frame [4 x 2] 

      -c mean(c) 
     (dbl)  (dbl) 
1 -0.95460749 0.95460749 
2 -0.93032589 0.93032589 
3 -0.40081121 0.40081121 
4 -0.05094088 0.05094088 

Ktoś wie, czy brakuje mi podstawowej funkcji lub skrótu, aby pomóc mi to zrobić szybko?

przykład przypadek użycia: jeśli df nagle zyskuje nową kolumnę d chciałbym kod wylotowej do tej pory łączna nad unikalnych kombinacji a, b, id, bez konieczności mi wyraźnie dodać do group_byd . zadzwonić)

+3

'df%>% group_by _ (. Dots = setdiff (nazwy (df)," c "))%>% summary (średnia (c)) 'może? –

+0

Tak, to jest to, na co się zdecydowałem, to po prostu wydaje się ... niezgrabne, jakoś. Pomyślałem, że może istnieć jakaś (nieznana mi) funkcja, która "chroni" wyrażenia takie jak "-c" od natychmiastowej oceny, która może być następnie traktowana tak, jakby zostały wykonane w wywołaniu 'select'. Ale ogólnie rzecz biorąc, tak, 'group_by_' i' setdiff' może załatwić sprawę, dzięki! – mmuurr

+0

Zgadzam się, że można by pomyśleć, że to powinno działać, ponieważ wygląda to jak typowa składnia Dplyra. Może sprawdzić, czy istnieje FR na GH, czy może to zostało zaimplementowane w wersji rozwojowej. Jeśli nie, możesz zrobić FR i zobaczyć, jak to działa. –

Odpowiedz

1

W obecnych wersjach dplyr, funkcja group_by_at wraz z vars, realizuje ten cel:

df %>% group_by_at(vars(-c)) %>% summarize(mean(c)) 
# A tibble: 2 x 3 
# Groups: a [?] 
     a  b `sum(c)` 
    <dbl> <chr>  <dbl> 
1  1 foo 0.9851376 
2  2 bar 1.0954412 

Wydaje się być wprowadzony w dplyr 0.7.0, w czerwcu 2017 roku

Powiązane problemy