2014-09-18 61 views
7

我使用dplyr并喜欢它,但发现一个奇怪的行为。我正在清理来自不同来源的一些数据,并将它们放在一个数据框中。其中一部分需要更多的清理工作,用dplyr完成并产生了tbl对象。另一部分更简单,我有一个data.frame对象。我把它们放在一起,当我做分析时,试图使用dplyr过滤器功能,它不能正常工作。例如:rbind tbl和df给出的错误与过滤器

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 

如果我做df3[df3$group == "C", ],它工作正常。错误?

+1

尝试'df3%>%ungroup()%>%filter(group ==“C”)'或'as.data.frame(df3)%>%filter(group ==“C”)''。 – akrun 2014-09-18 18:40:03

+0

@akrun是的,这两个工作! – 2014-09-18 18:53:31

+0

'df3 < - rbind(d1,as.tbl(df2))'导致同样的问题,所以它不是'df2'是数据框。 – Henrik 2014-09-18 19:05:36

回答

0

这是因为当您在df1上使用group_by时,其结构会发生变化,并在其上按组执行操作。当你做rbind

df3 <- rbind(df1, df2) 

R期望可以具有相同的结构创建DF3作为第一aregument即DF1,但因为DF1和DF2是不同类型dataframes的,当你运用它应用滤波器groupwose只df1并导致不稳定的输出。

如果你检查

df3<-rbind(df2,df1) 

DF3是没有组正常数据帧,并给出正确的输出。

0

您应该删除行 'DF1 < - DF1%>%GROUP_BY(组)#DF1现在TBL' 如果你想改变data.frame到tbl_df

,你应该使用 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