2014-09-18 19 views
7

Sto usando dplyr e lo adoro, ma ho trovato uno strano comportamento. Sto pulendo alcuni dati da diverse fonti e li ho riuniti in una cornice di dati. Parte di essa richiedeva una maggiore pulizia, fatta con dplyr e aveva come risultato un oggetto tbl. L'altra parte era più semplice e avevo un oggetto data.frame. I rbind insieme, e quando stavo facendo analisi, cercando di utilizzare la funzione di filtro dplyr, non funzionava correttamente. Esempio:rbind tbl e df danno errori con il filtro

df1 <- data.frame(
    group = factor(rep(c("C", "G"), 5)), 
    value = 1:10) 
df1 <- df1 %>% group_by(group) #df1 is now tbl 
df2 <- data.frame(
    group = factor(rep("G", 10)), 
    value = 11:20) 
df3 <- rbind(df1, df2) #df2 is data.frame 
df3 %>% filter(group == "C") #returns filtered rows in df1 and all rows of df2 
Source: local data frame [15 x 2] 
Groups: group 

    group value 
1  C  1 
2  C  3 
3  C  5 
4  C  7 
5  C  9 
6  G 11 
7  G 12 
8  G 13 
9  G 14 
10  G 15 
11  G 16 
12  G 17 
13  G 18 
14  G 19 
15  G 20 

Se faccio df3[df3$group == "C", ], funziona correttamente. Bug?

+1

Prova 'df3%>% ungroup()%>% filter (group ==" C ")' o 'as.data.frame (df3)%>% filter (group ==" C ")'. – akrun

+0

@akrun sì, entrambi questi lavori! –

+0

'df3 <- rbind (d1, as.tbl (df2))' ha lo stesso problema, quindi non è che 'df2' sia un frame di dati. – Henrik

risposta

0

È perché quando si utilizza group_by su df1, la sua struttura cambia e le operazioni vengono eseguite in base al gruppo. Quando si esegue il rbind

df3 <- rbind(df1, df2) 

R tenta di creare DF3 con la stessa struttura del primo DF1 aregument cioè ma poiché df1 e DF2 sono diversi tipi di dataframes, quando si applica il filtro viene applicato groupwose solo su df1 e genera l'output irregolare.

se controlli

df3<-rbind(df2,df1) 

DF3 è un dataframe normale senza gruppi e dà uscita corretta.

0

si dovrebbe eliminare la riga 'df1 < - df1%>% group_by (gruppo) # df1 è ora tbl'

se si vuole cambiare data.frame a tbl_df, si dovrebbe utilizzare df1<-tbl_df(df1)

df1 <- data.frame(
    group = factor(rep(c("C", "G"), 5)), 
    value = 1:10) 


# df1 <- df1 %>% group_by(group) #df1 is now tbl 
    # df1<-tbl_df(df1) 
    df2 <- data.frame(
     group = factor(rep("G", 10)), 
     value = 11:20) 
    df3 <- rbind(df1, df2) #df2 is data.frame 
    df3 %>% filter(group == "C") #returns filtered rows in df1 and all rows of df2 
Problemi correlati