使用dplyr过滤包含特定字符串的行

问题描述 投票:134回答:4

我必须使用作为标准过滤数据框,其中包含字符串RTB。我正在使用dplyr

d.del <- df %.%
  group_by(TrackingPixel) %.%
  summarise(MonthDelivery = as.integer(sum(Revenue))) %.%
  arrange(desc(MonthDelivery))

我知道我可以在filter中使用函数dplyr,但我不知道如何告诉它检查字符串的内容。

特别是我想检查TrackingPixel列中的内容。如果字符串包含标签RTB我想从结果中删除该行。

r filter dplyr
4个回答
212
投票

这个问题的答案已经由@latemail在上面的评论中发布了。你可以使用正则表达式来表示filter的第二个和后续参数,如下所示:

dplyr::filter(df, !grepl("RTB",TrackingPixel))

由于您尚未提供原始数据,我将使用mtcars数据集添加一个玩具示例。想象一下,您只对马自达或丰田生产的汽车感兴趣。

mtcars$type <- rownames(mtcars)
dplyr::filter(mtcars, grepl('Toyota|Mazda', type))

   mpg cyl  disp  hp drat    wt  qsec vs am gear carb           type
1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      Mazda RX4
2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  Mazda RX4 Wag
3 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
4 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1  Toyota Corona

如果你想反过来做,即不包括丰田和马自达汽车,filter命令看起来像这样:

dplyr::filter(mtcars, !grepl('Toyota|Mazda', type))

110
投票

可以使用str_detect包中包含的stringr包的tidyversestr_detect返回TrueFalse,以确定指定的向量是否包含某些特定字符串。可以使用此布尔值进行过滤。有关Introduction to stringr包的详细信息,请参阅stringr

library(tidyverse)
# ─ Attaching packages ──────────────────── tidyverse 1.2.1 ─
# ✔ ggplot2 2.2.1     ✔ purrr   0.2.4
# ✔ tibble  1.4.2     ✔ dplyr   0.7.4
# ✔ tidyr   0.7.2     ✔ stringr 1.2.0
# ✔ readr   1.1.1     ✔ forcats 0.3.0
# ─ Conflicts ───────────────────── tidyverse_conflicts() ─
# ✖ dplyr::filter() masks stats::filter()
# ✖ dplyr::lag()    masks stats::lag()

mtcars$type <- rownames(mtcars)
mtcars %>%
  filter(str_detect(type, 'Toyota|Mazda'))
# mpg cyl  disp  hp drat    wt  qsec vs am gear carb           type
# 1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      Mazda RX4
# 2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  Mazda RX4 Wag
# 3 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
# 4 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1  Toyota Corona

Stringr的好处

我们应该使用stringr::str_detect()而不是base::grepl()。这是因为有以下原因。

  • stringr包提供的函数以前缀str_开头,这使得代码更易于阅读。
  • stringr包的函数的第一个参数总是data.frame(或value),然后是参数。(谢谢Paolo)
object <- "stringr"
# The functions with the same prefix `str_`.
# The first argument is an object.
stringr::str_count(object) # -> 7
stringr::str_sub(object, 1, 3) # -> "str"
stringr::str_detect(object, "str") # -> TRUE
stringr::str_replace(object, "str", "") # -> "ingr"
# The function names without common points.
# The position of the argument of the object also does not match.
base::nchar(object) # -> 7
base::substr(object, 1, 3) # -> "str"
base::grepl("str", object) # -> TRUE
base::sub("str", "", object) # -> "ingr"

基准

基准测试的结果如下。对于大型数据帧,str_detect更快。

library(rbenchmark)
library(tidyverse)

# The data. Data expo 09. ASA Statistics Computing and Graphics 
# http://stat-computing.org/dataexpo/2009/the-data.html
df <- read_csv("Downloads/2008.csv")
print(dim(df))
# [1] 7009728      29

benchmark(
  "str_detect" = {df %>% filter(str_detect(Dest, 'MCO|BWI'))},
  "grepl" = {df %>% filter(grepl('MCO|BWI', Dest))},
  replications = 10,
  columns = c("test", "replications", "elapsed", "relative", "user.self", "sys.self"))
# test replications elapsed relative user.self sys.self
# 2      grepl           10  16.480    1.513    16.195    0.248
# 1 str_detect           10  10.891    1.000     9.594    1.281

9
投票

这个答案与其他人类似,但使用首选的stringr::str_detect和dplyr rownames_to_column

library(tidyverse)

mtcars %>% 
  rownames_to_column("type") %>% 
  filter(stringr::str_detect(type, 'Toyota|Mazda') )

#>             type  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1      Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> 2  Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> 3 Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> 4  Toyota Corona 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1

reprex package创建于2018-06-26(v0.2.0)。


0
投票

如果要在任何给定列中查找字符串,请查看

Remove row if any column contains a specific string

它基本上是关于使用qazxsw poi或qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.