如何将因子视为字符串并使用它们过滤数据帧

时间:2018-04-10 03:04:40

标签: r dplyr

我找不到轻松过滤data.frame因子的方法,我认为我可以使用str_detect作为字符串处理。我想过滤df$kind,不包括flow-deliverystorageflow-channel。我可以添加一个mutate(kind2 = as.character(kind)的列并对其进行过滤,但我宁愿没有冗余,而且我确定我错过了明显的。

 library(dplyr)
 plot_monoth_ts <- function(df, yearmon, rawval, rawunit, dv, study, yrmin, yrmax) 
 {df %>% filter(str_detect(!kind, 'flow-delivery|storage|flow-channel')) %>%
 ggplot(aes(x = yearmon, y = rawval, color = study, linetype = dv))+geom_line()}

返回此错误:

  Warning message:
  In Ops.factor(kind) : ‘!’ not meaningful for factors

任何提示都非常感谢。

谢谢你, 戴夫

1 个答案:

答案 0 :(得分:2)

你过分思考它!产品:&gt;不需要进行字符转换。只要该因子与label的每个level相关联,就可以将这些级别称为字符串。

iris %>% head

# Note that 'Species' is a Factor with 3 levels.

# Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 56           5.7         2.8          4.5         1.3 versicolor
# 44           5.0         3.5          1.6         0.6     setosa
# 104          6.3         2.9          5.6         1.8  virginica
# 123          7.7         2.8          6.7         2.0  virginica
# 149          6.2         3.4          5.4         2.3  virginica

omitted <- c("versicolor", "setosa")
filter(iris, !(Species %in% omitted)) %>% sample_n(5)

# Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
# 22          5.6         2.8          4.9         2.0 virginica
# 34          6.3         2.8          5.1         1.5 virginica
# 41          6.7         3.1          5.6         2.4 virginica
# 17          6.5         3.0          5.5         1.8 virginica
# 19          7.7         2.6          6.9         2.3 virginica

注意!(x %in% y)构造。

快速比较速度:

library(microbenchmark)

microbenchmark(filter(iris, !(Species %in% c("versicolor", "setosa"))))

# Unit: microseconds
# min     lq       mean     median   uq       max
# 568.189 575.8505 600.3869 580.8085 603.3435 870.7620

microbenchmark(filter(iris, !str_detect(as.character(Species), "versicolor|setosa")))

# Unit: microseconds
# min     lq       mean     median   uq      max
# 620.169 633.6910 671.0874 656.8275 687.325 928.1510

正如预期的那样,即使在像iris这样的小数据集上,转换为字符然后使用正则表达式模式匹配也会变慢。