2014-09-18 24 views
7

Używam dplyr i kocham to, ale znalazłem dziwne zachowanie. Czyszczę niektóre dane z różnych źródeł i umieszczam je w ramce danych. Część tego wymagała większego czyszczenia, wykonanego przy użyciu dplyr i otrzymała obiekt tbl. Druga część była prostsza, a ja miałem obiekt data.frame. I rbind ich razem, a kiedy robiłem analizy, próbując użyć funkcji filtrowania dplyr, to nie działałoby poprawnie. Przykład:rbind tbl i df daje błędy z filtrem

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 

Jeśli wykonam df3[df3$group == "C", ], działa poprawnie. Pluskwa?

+1

Wypróbuj 'df3%>% rozgrupuj()%>% filtr (grupa ==" C ")' lub 'as.data.frame (df3)%>% filtr (grupa ==" C ")'. – akrun

+0

@akrun yep, obie te czynności! –

+0

'df3 <- rbind (d1, as.tbl (df2))' powoduje ten sam problem, więc nie chodzi o to, że "df2" jest ramką danych. – Henrik

Odpowiedz

0

Dzieje się tak, ponieważ gdy używasz group_by na df1, zmienia się jego struktura i operacje są wykonywane na nim grupowo. Po wykonaniu rbind

df3 <- rbind(df1, df2) 

R próbuje utworzyć DF3 o takiej samej strukturze jak pierwszego aregument tj DF1 ale ponieważ DF1 i df2 są różne rodzaje dataframes, kiedy zastosować filtr jest stosowany groupwose tylko na df1 i skutkuje błędnym wyjściem.

sprawdzając

df3<-rbind(df2,df1) 

DF3

jest normalną dataframe bez grup i daje poprawny wynik.

0

należy usunąć wiersz 'DF1 < - DF1%>% group_by (grupa) # DF1 jest teraz tbl'

jeśli chcesz zmienić data.frame do tbl_df, powinieneś użyć 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