r-rbind-tbl和df通过滤波器给出误差



我正在使用dplyr并喜欢它,但发现了一个奇怪的行为。我正在清理来自不同来源的一些数据,并将它们放在一个数据框架中。其中一部分需要使用dplyr进行更多的清理,并生成了tbl对象。另一部分比较简单,我有一个data.frame对象。我把它们rbind放在一起,当我进行分析时,试图使用dplyr过滤函数,它无法正常工作。示例:

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", ],它工作正常。程序错误

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

df3 <- rbind(df1, df2) 

R试图创建与第一个部分(即df1)具有相同结构的df3,但由于df1和df2是不同类型的数据帧,当您应用过滤器时,它仅在df1上成组应用,并导致不稳定的输出。

如果你检查

df3<-rbind(df2,df1)

df3是一个没有组的普通数据帧,并给出正确的输出。

您应该删除行'df1<-df1%>%group_by(group)#df1现在是tbl'

如果要将data.frame更改为tbldf,则应该使用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

最新更新