2014-12-18 10 views
5

Widzę coś, co wygląda dziwnie w funkcji do w dplyr 0.3.0.2, ale może coś nie rozumiem.nieparzyste zachowanie funkcji do() w dplyr

Mam ramki danych, który wygląda jak

set.seed(668) 
stuff <- data.frame(name=c(rep("Frodzak", 5), rep("Dumpf", 4), rep("Ackpth", 6)), 
       state=c("AL", "AK", "AL", "KS", "OR", "LA", "MS", "KY", "FL", 
         "NY", "NY", "NJ", "PA", "NJ", "NY"), 
       important=c(F, F, T, F, F, T, F, F, F, T, F, F, F, F, F), 
       girth=rnorm(15, 250, 80), stringsAsFactors=F) 


stuff 

     name state important girth 

1 Frodzak AL  FALSE 148.5870 
2 Frodzak AK  FALSE 321.4144 
3 Frodzak AL  TRUE 224.8380 
4 Frodzak KS  FALSE 315.9416 
5 Frodzak OR  FALSE 331.4336 
6 Dumpf LA  TRUE 317.4794 
7 Dumpf MS  FALSE 170.4174 
8 Dumpf KY  FALSE 275.4033 
9 Dumpf FL  FALSE 240.9276 
10 Ackpth NY  TRUE 145.6290 
11 Ackpth NY  FALSE 267.6902 
12 Ackpth NJ  FALSE 171.4015 
13 Ackpth PA  FALSE 298.5841 
14 Ackpth NJ  FALSE 249.5764 
15 Ackpth NY  FALSE 276.5504 

W mojej aplikacji, nie będzie dokładnie jeden TRUE w kolumnie „ważne” dla każdej grupy wierszy o tej samej „name”. Chcę podzbiór pliku df, tak aby zawierał tylko te wiersze, w których stan pasuje do stanu "ważnego" wiersza (w obrębie każdej grupy "nazwa"). Innymi słowy, chcę dostać

 name state important girth 
1 Ackpth NY  TRUE 145.6290 
2 Ackpth NY  FALSE 267.6902 
3 Ackpth NY  FALSE 276.5504 
4 Dumpf LA  TRUE 317.4794 
5 Frodzak AL  FALSE 148.5870 
6 Frodzak AL  TRUE 224.8380 

Jeżeli uruchomić następujące:

importantState <- function(df) { 
    impst <- df[df$important, "state"] 
    if (length(impst) != 1) stop("group does not have one 'important'") 
    impst 
} 

stuff %>% group_by(name) %>% do(.[.$state == importantState(.), ]) 

w dplyr 0.2 dostać dokładnie to, czego się spodziewać (powyżej 6-podzbiór wierszy). Jeśli jednak uruchomię dokładnie ten sam kod przy użyciu dplyr 0.3.0.2, zwróci on cały oryginalny plik df (wszystkie 15 wierszy).

Spojrzałem na uwagi o wersji 0.3 na github, ale nie widzę niczego, co mogłoby się wiązać ze zmianą zachowania merytorycznego w do.

Czy ktoś może mi pomóc odzyskać choć odrobinę zdrowia psychicznego, wyjaśniając, co się tu dzieje w niebie? Albo jakieś pomysły na twórczą pracę, o której nie myślałem?

+0

Może nie rozumiem, ale dlaczego nie używasz do tego celu filtru? –

+0

Dobre pytanie :-) Myślę, że moja gęsta głowa nie zdawała sobie sprawy, że możesz to zrobić w ten sposób ... – NumerousHats

Odpowiedz

2

Być może mógłbyś wypróbować tutaj filter?

stuff %>% 
    group_by(name) %>% 
    filter(state == state[important]) 

#  name state important girth 
# 1 Frodzak AL  FALSE 148.5870 
# 2 Frodzak AL  TRUE 224.8380 
# 3 Dumpf LA  TRUE 317.4794 
# 4 Ackpth NY  TRUE 145.6290 
# 5 Ackpth NY  FALSE 267.6902 
# 6 Ackpth NY  FALSE 276.5504 
Powiązane problemy