2014-12-18 13 views
5

Ich sehe, was wie seltsam Verhalten der do Funktion in dplyr 0.3.0.2 aussieht, aber vielleicht ich etwas falsch verstehe.Odd Verhalten von do() -Funktion in dplyr

Ich habe einen Datenrahmen, der wie

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 

In meiner Anwendung sieht, wird es für jede Gruppe von Zeilen mit demselben „namen“ genau ein TRUE in der „wichtigen“ Spalte sein. Ich möchte das df so unterteilen, dass es nur die Zeilen enthält, in denen der Status dem Status der "wichtigen" Zeile entspricht (innerhalb jeder "Name" -Gruppe). Mit anderen Worten, ich möchte

 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 

bekommen, wenn ich folgendes ausgeführt:

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(.), ]) 

In dplyr 0.2 bekomme ich genau das, was ich erwarte, dass (die über 6-Zeilensubset). Wenn ich jedoch den exakt gleichen Code unter Verwendung von dplyr 0.3.0.2 ausführe, wird das gesamte ursprüngliche df zurückgegeben (alle 15 Zeilen).

Ich schaute auf die 0.3 Release Notes auf Github, aber ich sehe nichts, das auf eine Änderung in der inhaltlichen Verhalten in do beziehen würde.

Kann mir jemand helfen, wenigstens ein wenig von meiner Vernunft wiederzuerlangen, indem ich erkläre, was im Himmel hier vor sich geht? Oder irgendwelche Ideen für eine kreative Arbeit, an die ich nicht gedacht habe?

+0

Vielleicht verstehe ich nicht, aber warum verwenden Sie 'Filter' nicht dafür? –

+0

Gute Frage :-) Ich denke, mein dicker Kopf hat nicht gemerkt, dass du es so machen kannst ... – NumerousHats

Antwort

2

Vielleicht könnten Sie versuchen filter hier?

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