【问题标题】:how to delete words from a list in a column in R如何从R中的列中的列表中删除单词
【发布时间】:2016-03-13 13:14:55
【问题描述】:

我在表格中有一列标题,我想删除单独表格/向量中列出的所有单词。

例如,标题表:

“Lorem ipsum dolor”
"坐下来,consectetur adipiscing"
"elit, sed 做 eiusmod tempor"
“不劳而获”
“et dolore magna aliqua。”

待删除:c("Lorem", "dolore", "elit")

输出:

“ipsum 悲伤”
"坐下来,consectetur adipiscing"
", sed 做 eiusmod tempor"
“不劳而获”
“et magna aliqua。”

被列入黑名单的单词可以出现多次。

tm 包有这个功能,但是当应用于 wordcloud 时。我需要的是保持列完整,而不是将所有行连接成一个字符串。当给定一组值作为模式时,正则表达式函数 (gsub()) 似乎不起作用。 Oracle SQL 解决方案也很有趣。

【问题讨论】:

标签: regex r oracle text mining


【解决方案1】:
lorem <- c("Lorem ipsum dolor",
           "sit amet, consectetur adipiscing",
           "elit, sed do eiusmod tempor",
           "incididunt ut labore",
           "et dolore magna aliqua.")

to.delete <- c("Lorem", "dolore", "elit")

output <- lorem
for (i in to.delete) {
  output <- gsub(i, "", output)
}

这给出了:

[1] " ipsum dolor"                     "sit amet, consectetur adipiscing"
[3] ", sed do eiusmod tempor"          "incididunt ut labore"            
[5] "et  magna aliqua."

【讨论】:

  • 非常感谢,我也在考虑循环 gsub,我只是担心这在性能方面是否可行:to.delete 列表有几千个单词,所以这意味着要执行几千个gsub - 这可能是个问题吗?
  • 它可能会很慢。在这种情况下,@jeremycg 的答案可能对您来说运行得更快。
【解决方案2】:

先读取数据:

dat <- c("Lorem ipsum dolor",
           "sit amet, consectetur adipiscing",
           "elit, sed do eiusmod tempor",
           "incididunt ut labore",
           "et dolore magna aliqua.")
todelete <- c("Lorem", "dolore", "elit")

我们可以通过一些巧妙的粘贴来避免循环。 | 是一个或者我们可以粘贴它,允许我们删除任何循环:

gsub(paste0(todelete, collapse = "|"), "", dat)

【讨论】:

  • 对于未来的读者——这个方法对于长的“删除”向量(在我的例子中是数千个单词)失败,所以看起来循环有时是不可避免的。
【解决方案3】:

你也可以使用stri_replace_all_fixed:

library(stringi)
lorem <- c("Lorem ipsum dolor",
           "sit amet, consectetur adipiscing",
           "elit, sed do eiusmod tempor",
           "incididunt ut labore",
           "et dolore magna aliqua.")

to.delete <- c("Lorem", "dolore", "elit")

#just a simple function call
library(stringi)
stri_replace_all_fixed(lorem, to.delete, '')

输出:

[1] " ipsum dolor"                     "sit amet, consectetur adipiscing" ", sed do eiusmod tempor"         
[4] "incididunt ut labore"             "et  magna aliqua."               

【讨论】:

    【解决方案4】:

    tm-Package 为此实现了一个功能: tm:::removeWords.character

    实现如下:

    foo <- function(x, words){
      gsub(sprintf("(*UCP)\\b(%s)\\b", paste(sort(words, decreasing = TRUE), 
                                             collapse = "|")), "", x, perl = TRUE)
    }
    

    这给了你

    gsub("(*UCP)\\b(Lorem|elit|dolore)\\b","", x, perl = TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2020-01-28
      • 2018-09-28
      相关资源
      最近更新 更多