2016-07-29 23 views
10

Po użyciu data.table przez jakiś czas myślałem, że nadszedł czas, aby spróbować dplyr. To zabawne, ale nie byłem w stanie dowiedzieć się, jak uzyskać dostęp do - bieżącej zmiennej grupowej - zwracanie wielu wartości dla grupydplyr: aktualna zmienna grupy dostępu

Poniższy przykład pokazuje działa poprawnie z data.table. W jaki sposób można napisać to z dplyr

foo <- matrix(c(1, 2, 3, 4), ncol = 2) 
dt <- data.table(a = c(1, 1, 2), b = c(4, 5, 6)) 

# data.table (expected) 
dt[, .(c = foo[, a]), by = a] 
    a c 
1: 1 1 
2: 1 2 
3: 2 3 
4: 2 4 

# dplyr (?) 
dt %>% 
    group_by(a) %>% 
    summarize(c = foo[a]) 
+2

Z 'summarize' , możesz nie być w stanie tego zrobić, możesz spróbować z 'do' – akrun

+2

Brakuje przecinka w swoim 'foo [a]' ... W każdym razie, jak sugerował akrun, podsumowanie nie pasuje, ponieważ lubi zwracać jeden wiersz na grupę. Ani mutate, który lubi zwracać n() aka .N, więc musisz zhackować coś razem w świecie dplyr. – Frank

+0

hm. dzięki. Wciąż nie ma sukcesu z: dt%>% group_by (a)%>% do (c = foo [, a]) Czy możesz pokazać mi fragment roboczy? –

Odpowiedz

7

Możemy użyć do z dplyr. (Brak innych pakietów). Model do jest bardzo przydatny do rozwijania wierszy. Musimy tylko opakować za pomocą data.frame.

dt %>% 
    group_by(a) %>% 
    do(data.frame(c = foo[, unique(.$a)])) 
#  a  c 
# <dbl> <dbl> 
#1  1  1 
#2  1  2 
#3  2  3 
#4  2  4 

Albo zamiast unique możemy podzbioru 1. obserwacji

dt %>% 
    group_by(a) %>% 
    do(data.frame(c = foo[, .$a[1]])) 
#  a  c 
# <dbl> <dbl> 
#1  1  1 
#2  1  2 
#3  2  3 
#4  2  4 

ten może być również wykonane bez użycia żadnych pakietów

stack(lapply(split(dt$a, dt$a), function(x) foo[,unique(x)]))[2:1] 
# ind values 
#1 1  1 
#2 1  2 
#3 2  3 
#4 2  4 
7

Nadal można uzyskać dostęp do zmiennej grupy, ale to jest jak normalny wektor z jednej unikalnej wartości dla każdej grupy, więc jeśli umieścić unique wokół niego, to będzie działać. A w tym samym czasie, dplyr nie wydaje się automatycznie rozwinąć wiersze jak data.table, potrzebne będą unnest z tidyr pakiet:

library(dplyr); library(tidyr) 
dt %>% 
     group_by(a) %>% 
     summarize(c = list(foo[,unique(a)])) %>% 
     unnest() 

# Source: local data frame [4 x 2] 

#  a  c 
# <dbl> <dbl> 
# 1  1  1 
# 2  1  2 
# 3  2  3 
# 4  2  4 

Albo możemy użyć first przyspieszyć, ponieważ my już wiemy zmiennej grupowej wektor jest taki sam dla każdej grupy:

dt %>% 
     group_by(a) %>% 
     summarize(c = list(foo[,first(a)])) %>% 
     unnest() 

# Source: local data frame [4 x 2] 

#  a  c 
# <dbl> <dbl> 
# 1  1  1 
# 2  1  2 
# 3  2  3 
# 4  2  4