我找不到轻松过滤data.frame
因子的方法,我认为我可以使用str_detect
作为字符串处理。我想过滤df$kind
,不包括flow-delivery
,storage
或flow-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
任何提示都非常感谢。
谢谢你, 戴夫答案 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
这样的小数据集上,转换为字符然后使用正则表达式模式匹配也会变慢。