2014-12-18 11 views
5

Vedo quello che sembra uno strano comportamento della funzione do in dplyr 0.3.0.2, ma forse sto fraintendendo qualcosa.comportamento anomalo della funzione do() in dplyr

Ho un frame di dati che assomiglia

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 

Nella mia domanda, ci sarà esattamente un TRUE nella colonna "importante" per ogni gruppo di righe con lo stesso "nome". Voglio suddividere il df in modo tale da includere solo le righe in cui lo stato corrisponde allo stato della riga "importante" (all'interno di ciascun gruppo "nome"). In altre parole, voglio ottenere

 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 

Se corro il seguente:

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 ottengo esattamente quello che mi aspetto (sopra sottoinsieme 6-fila). Tuttavia, se eseguo lo stesso identico codice utilizzando dplyr 0.3.0.2, restituisce l'intero file originale df (tutte le 15 righe).

Ho guardato le note di rilascio di 0.3 su github, ma non vedo nulla che possa riguardare un cambiamento nel comportamento sostanziale in do.

Qualcuno può aiutarmi a recuperare almeno un po 'della mia sanità mentale spiegando cosa sta succedendo in cielo? O qualche idea per un lavoro creativo intorno a cui non ho pensato?

+0

Forse non sto capendo, ma perché non stai usando 'filtro' per questo? –

+0

Buona domanda :-) Immagino che la mia testa grossa non si rendesse conto che potevi farlo in quel modo ... – NumerousHats

risposta

2

Forse potresti provare filter qui?

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 
Problemi correlati