【问题标题】:How to make my str_detect code more efficient in R? [duplicate]如何让我的 str_detect 代码在 R 中更高效? [复制]
【发布时间】:2021-02-21 06:02:44
【问题描述】:

我想检查在我的观察 (1867) 中是否存在 6900 个名称列表中的一只股票,如果存在,则在不同的列中写“是”。

这是我的代码:

for (i in 1:length(df$upvotes)){
  if (str_detect(df$text[i], pattern = paste("[:space:](\\$?)",stocks$Stocks,"(\\$?)[:space:]",collapse ="|"))){
    df$call[i] <- "yes"
  }}

问题是 20 分钟后仍在运行,而我的计算机发热很多。如果我删除所有正则表达式,它会在几分钟内完成任务。 如何改进代码以提高效率?

【问题讨论】:

  • 您能提供一些dput(head(df)) 的示例数据吗?避免循环通常会使代码更高效。
  • 它说太长了,pastebin给我带来了问题,因为观察中有冒犯性的术语,我该如何提供给你?
  • 您是否使用head 只得到几行?
  • 我复制了你提供的代码,问题是第一个观察结果是整个 reddit 帖子
  • 好的,我明白了...我建议的其他链接呢?

标签: r stringr


【解决方案1】:

R return true or false per row if string contains any of a list of words 中提供的解决方案似乎适用于您提供的数据。

例如:

stocks <- data.frame(stock = c("AAPL","AACG","AACQ","AACQU","AACQW","AAIC"))

stocksearch <- paste0("[\\s$]",stocks$stock,"+[\\s$]",collapse ="|")

which(str_detect(df$text, stocksearch))
[1] 352

df$text[352]
[1] "Blew up my account with AMD and AAPL calls expiring after earnings.\n\nNow I'm going bear mode and hitting up that VIX and spy Puts"

#Dataframe update
df$call[which(str_detect(df$text, stocksearch))] <- "yes"

【讨论】:

  • 感谢您的回答,我尝试添加正则表达式(我想要股票名称前后的空格和可以在股票名称开头或结尾的美元或缺席),但我仍然无法运行它。我的代码是:paste("[:space:](\\$?)",stocks$Stocks,"(\\$?)[:space:]",collapse ="|")。我还尝试删除美元符号部分
  • 您能否举例说明您正在寻找的股票。我了解:$AAPL AAPL$str_detect("test $AAPL test ",stocksearch) 返回FALSE
  • 可以是“AAPL”、“$AAPL”或“AAPL$”
  • 我根据您的需要更新了正则表达式。
猜你喜欢
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 2021-06-01
相关资源
最近更新 更多