【问题标题】:Have a dataframe of tweets, wanting to filter out tweets that contain one of a number of keywords in the text with str_detect() in R有一个推文数据框,想要在 R 中使用 str_detect() 过滤出包含文本中多个关键字之一的推文
【发布时间】:2022-11-14 01:51:06
【问题描述】:

我有一个推文数据框。我想确定所有包含至少一个对一组国家/地区的引用的推文。

这些引用可以以各种形式出现。例如,对美国的引用可能写为“美国”、“华盛顿”、“拜登”或其他一些东西。我认为最好的方法是为每个国家/地区创建一个向量,其中包含我正在搜索的每个值:

usid <- c("America", "Washington", "Biden")

rusid <- c("Russia", "Moscow", "Putin")

chnid <- c("China", "Beijing", "Xi jingping")

ids <- c(usid, rusid, chnid)

等等。请注意,这只是一个示例。我有 18 个国家/地区,每个国家/地区都有一个术语向量。

我一直在使用 stringr,因为我认为 str_detect() 函数将是执行此操作的最佳方法。

我试过了:

newdf <- filter(df, str_detect(text, usid))

这将仅返回包含“America”但向量中没有其他值的推文,并且此错误消息:“警告消息:在 stri_detect_regex(string, pattern, negate = negate, opts_regex = opts(pattern)):更长的对象长度不是较短物体长度的倍数"

当我使用:

newdf <- filter(df, str_detect(text, ids))

我得到看似随机的结果和相同的错误消息。

解决上述问题后,我希望能够在 ids 向量中否定某些国家向量。例如,我想在数据框中搜索除美国向量之外的所有国家向量:

newdf <- filter(df, str_detect(text, ids![usid]))

但我不确定这个的语法。

【问题讨论】:

  • 您应该使用“过滤器”而不是过滤器
  • 哈哈,好收获。不幸的是,这只是我的帖子中的一个错字,而不是我的脚本。已编辑,加油。
  • 好的 :D 所以这里我有一个功能可以帮助解决您的问题。首先让 "text" 为 text <- c("America", "B","C", "Germany"),然后您可以使用 newdf <- text %in% usid 检查哪些单词与 usid 匹配。您可以尝试将其与 str_detect 结合使用。我的情况是你得到结果 TRUE FALSE FALSE FALSE 因为 text[1] 匹配“America”
  • 抱歉,澄清一下,我在 str_detect 函数中引用的“文本”是我正在过滤的列的名称。

标签: r twitter stringr


【解决方案1】:

您需要包括“或”。

代替

newdf <- filter(df, str_detect(text, usid))

你可以

newdf <- filter(df, str_detect(text, paste0(usid, collapse = "|")))

usid 变为 "America|Washington|Biden"

如果你想要除 usid 之外的所有内容,这两个调用的作用完全相同。一个使用str_detect 中的参数negate,另一个使用! 作为否定运算符。

filter(df, str_detect(text, paste0(usid, collapse = "|"), negate = T))
filter(df, !str_detect(text, paste0(usid, collapse = "|")))

【讨论】:

  • 谢谢你,凯特!这很好用。该解决方案解决了我遇到的第一个和第二个问题。你对第三部分有什么想法吗?如何从向量的向量中排除一个向量?
  • 对于那个很抱歉。我已添加到我的答案中以处理您问题的这一部分。
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多