【问题标题】:Using variables alongside strings in a regex in R在 R 的正则表达式中将变量与字符串一起使用
【发布时间】:2018-11-12 20:26:45
【问题描述】:

我的数据集包含一些我正在尝试清理其域的电子邮件地址:

id <- c(1,2,3,4,5)
email <- c('jim@chase.com','steve@aol.com','stacy@gmail.com/','chris@yahoo.com','emilio@verizon.net/')
sample <- data.frame(id,email)

我正在尝试根据包含域的导入 .txt 文件删除行;例如,domains.txt 包含

chase.com verizon.net

我阅读了 .txt 文件

domains <- read_file('C:\\\\me\\domains.txt')
domains <- strsplit(domains, ' ')

但是我不知道如何成功地清理这些。我尝试了两种解决方案,一种带有regex 代码,另一种没有:

sample <- sample[!(paste0('^',domains,'$') %in% sample$email)]

sample$domains <- grepl(paste0('^',domains,'$'),sample$email)
sample <- subset(sample, domains == FALSE, select = c(id,email))

第一个将我的数据转换为 tibble(每当我尝试显示它时都会导致 Column indexes must be at most 4 if positive, not 5, 6, 7, 8, 9, 10 错误),而第二个为所有域返回 FALSE,包括那些包含在 domains 中列出的域的域变量。

当字符串在变量的任一侧也有需要读取的文本时,如何使用变量创建“搜索和销毁”regex

【问题讨论】:

  • read_file 来自readr 吗?
  • 您是要删除域,还是删除找到这些域的观察结果?
  • 它是 readr::read_file。我正在尝试删除包含这些域的案例。

标签: r regex dataframe


【解决方案1】:

我们将paste 'pat' 的元素转换为单个字符串,paste| 分隔以匹配任一元素与'email' 列,使用grepl 返回逻辑索引,取反(!) 将 TRUE 更改为 FALSE,反之亦然,将“样本”的行子集

sample[!grepl(paste(pat, collapse="|"), sample$email), , drop = FALSE]

数据

pat <- c('chase.com', 'verizon.net')

【讨论】:

  • 我会感谢你的 grep,但我想补充一点,这只适用于串联 pat。如果我将 domain.txt 文件读入域,就像我上面提到的那样,它读取为列表而不是串联,导致代码 sample[!grepl(paste(domains[[1]], collapse="|"), sample$email), , drop = FALSE]
  • @Yehuda 不清楚domains的结构。如果是list,可以先unlistpaste
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多