2014-09-18 20 views
7

Tôi đang sử dụng dplyr và yêu thích nó, nhưng tìm thấy một hành vi lạ. Tôi đang làm sạch một số dữ liệu từ các nguồn khác nhau và đặt chúng lại với nhau trong một khung dữ liệu. Một phần của nó yêu cầu làm sạch nhiều hơn, được thực hiện với dplyr và dẫn đến một đối tượng tbl. Phần khác đơn giản hơn, và tôi có một đối tượng data.frame. Tôi rbind chúng lại với nhau, và khi tôi đang phân tích, cố gắng sử dụng chức năng lọc dplyr, nó sẽ không hoạt động đúng cách. Ví dụ:rbind tbl và df đưa ra lỗi với bộ lọc

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 

Nếu tôi làm df3[df3$group == "C", ], nó hoạt động bình thường. Lỗi?

+1

Thử 'df3%>% ungroup()%>% bộ lọc (nhóm ==" C ")' hoặc 'as.data.frame (df3)%>% bộ lọc (nhóm ==" C ")'. – akrun

+0

@akrun yep, cả hai đều hoạt động! –

+0

'df3 <- rbind (d1, as.tbl (df2))' kết quả trong cùng một vấn đề, do đó, nó không phải về 'df2' là một khung dữ liệu. – Henrik

Trả lời

0

Đó là vì khi bạn sử dụng nhóm_by trên df1, các thay đổi cấu trúc và hoạt động của nó được thực hiện trên nhóm đó một cách khôn ngoan. Khi bạn làm như rbind

df3 <- rbind(df1, df2) 

R cố gắng để tạo ra df3 với cấu trúc tương tự như của df1 đầu tiên aregument tức nhưng vì df1 và df2 nhiều loại khác nhau của dataframes, khi bạn áp dụng bộ lọc được áp dụng groupwose chỉ trên df1 và kết quả đầu ra thất thường.

nếu bạn kiểm tra

df3<-rbind(df2,df1) 

df3 là một dataframe bình thường không có nhóm và đưa ra chính xác.

0

bạn nên xóa hàng 'df1 < - df1%>% group_by (nhóm) # df1 bây giờ tbl'

nếu bạn muốn thay đổi data.frame để tbl_df, bạn nên sử dụng 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 
Các vấn đề liên quan