无法过滤数据框?

时间:2011-10-01 22:25:29

标签: r ggplot2

我正在使用这样的东西来过滤我的数据框:

d1 = data.frame(data[data$ColA == "ColACat1" & data$ColB == "ColBCat2", ])

当我打印d1时,它按预期工作。但是,当我输入d1 $ ColB时,它仍会打印原始数据框中的所有内容。

> print(d1)
ColA     ColB
-----------------
ColACat1 ColBCat2
ColACat1 ColBCat2

> print(d1$ColA)
Levels: ColACat1 ColACat2

也许这是预期的,但是当我将d1传递给ggplot时,它会弄乱我的图表并且不会使用过滤器。无论如何我可以过滤数据框并获得与过滤器匹配的记录吗?我希望d1不知道data的存在。

2 个答案:

答案 0 :(得分:5)

正如您所提到的,R中的默认行为是将数据帧中的字符列视为特殊数据类型,称为factor。这是一个功能,而不是一个错误,但是如果您没有预期它并且不知道如何正确使用它,那么就像任何有用的功能一样,它可能会非常混乱。

factors旨在表示分类(而不是数字或定量)变量,这些变量经常出现在统计数据中。

您使用的子集化操作实际上可以正常工作。也就是说,它们将返回数据框的正确子集。但是,该变量的levels属性保持不变,并且仍然具有 all 原始级别。

这意味着用R编写的任何用于利用factors的方法都会将该列视为具有一堆级别的分类变量,其中许多级别不存在。在统计学中,人们通常希望跟踪“缺失”级别的分类变量的存在。

我实际上也更喜欢与stringsAsFactors = FALSE合作,但很多人对此不以为然,因为它可以降低代码的可移植性。 (TRUE是默认设置,因此与其他人共享您的代码可能会有风险,除非您通过调用options来为每个脚本添加前缀。

一种可能更方便的解决方案,尤其是数据框架,是将subsetdroplevels功能结合起来:

subsetDrop <- function(...){
    droplevels(subset(...))
}

并使用此函数以确保删除结果中任何未使用级别的方式提取数据帧的子集。

答案 1 :(得分:2)

这真是太痛苦了!如果你不这样做,ggplot会搞砸。在我的脚本开头使用此选项解决了它:

options(stringsAsFactors = FALSE)

看起来这是预期的行为,但遗憾的是我已将此功能用于其他目的,但它开始给我的所有其他脚本带来麻烦。