【问题标题】:R: grep multiple strings at onceR:一次grep多个字符串
【发布时间】:2019-05-04 21:57:35
【问题描述】:

我有一个包含 1 个变量和 5,000 行的数据框,其中每个元素都是一个字符串。

1. "Am open about my feelings."                   
2. "Take charge."                                 
3. "Talk to a lot of different people at parties."
4. "Make friends easily."                         
5. "Never at a loss for words."                   
6. "Don't talk a lot."                            
7. "Keep in the background."                      
   .....
5000. "Speak softly."           

我需要找到并输出对应于 3 个特定元素的行号。 目前,我使用以下内容:

grep("Take charge." ,  df[,1]) 
grep("Make friends easily.",  df[,1])  
grep("Make friends easily.",  df[,1])  

并得到以下输出: [1] 2 [2] 4 [3] 5000

问题 1. 有没有办法让语法更简洁,所以我不必在每一行都使用 grep 和 df[,1]?

问题 2. 如果是这样,如何输出所需行位置的单个数值数组,结果看起来像这样?

2, 4, 5000

到目前为止我尝试了什么。
grep("负责。" , "轻松交朋友。","轻松交朋友。",
df[,1]) # 这没用

我尝试创建一个名为 m1 的向量,它包含所有三个元素,然后 grep(m1, df[,1]) # 这也不起作用

【问题讨论】:

  • 基本上是grep using a character vector with multiple patternsthis 的副本(用grepl 代替regexpr)。
  • 以防万一答案不清楚,您可以选择patterns = c("Take charge.", "Make friends easily."),一个简单的方法是which(grepl(paste(patterns, collapse = "|"), df[,1]))。这是标准正则表达式,其中 . 匹配任何单个字符 --- 如果您想匹配文字 "." 在您的模式中转义它,例如 "Take charge\\."
  • 但是 Gabor 在他的回答中有一个很好的观点——如果这些是完整的、完全匹配的,那么非正则表达式的解决方案会更简单、更有效。
  • 我尝试了这两种解决方案,出于某种原因,您的解决方案运行良好,但 Gabor 没有,也许我做错了什么。无论如何,感谢您的意见!非常感谢!

标签: r string


【解决方案1】:

由于这些是完全匹配,请使用它,其中phrases 是您要匹配的短语的字符向量:

match(phrases, df[, 1])

如果没有短语是另一个短语的子字符串,这也有效:

grep(phrases, df[, 1])

【讨论】:

  • 由于 OP 并不清楚唯一性,可能值得一提的是 match(prhases, df[, 1])which(df[, 1] %in% phrases) 之间的区别。
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多