rbind tbl 和 df 给出过滤器错误

Posted

技术标签:

【中文标题】rbind tbl 和 df 给出过滤器错误【英文标题】:rbind tbl and df gives errors with filter 【发布时间】:2014-11-13 05:20:36 【问题描述】:

我正在使用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", ],它可以正常工作。错误?

【问题讨论】:

试试df3 %&gt;% ungroup() %&gt;% filter(group=="C")as.data.frame(df3) %&gt;% filter(group=="C") @akrun 是的,这两个都有效! df3 &lt;- rbind(d1, as.tbl(df2)) 会导致同样的问题,因此这与 'df2' 不是数据框有关。 df3 &lt;- rbind(df2, df1)(切换顺序)也可以。 rbind(df1, df2) 返回 grouped_dt,内部结构混乱。检查str(df3) 看起来使用 dplyr 中的 rbind_list 而不是 rbind 有效(无论顺序如何,都会产生一个 data.frame)。 【参考方案1】:

你应该删除行 'df1 % group_by(group) #df1 is now tbl'

如果你想改变 data.frame 为 tbl_df,你应该使用 df1&lt;-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

【讨论】:

【参考方案2】:

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

df3 <- rbind(df1, df2) 

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

如果你检查

df3<-rbind(df2,df1)

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

【讨论】:

以上是关于rbind tbl 和 df 给出过滤器错误的主要内容,如果未能解决你的问题,请参考以下文章

为什么我在计数和过滤后丢失我的NA(dplyr)

在 dplyr 中过滤日期

Yii2 和 reactjs CORS 过滤器给出错误:预检响应具有无效的 HTTP 状态代码 401

试图使用rbind时出现数字错误。

过滤df时出现pyspark.sql.utils.ParseException错误

过滤器功能不起作用并给出错误