【问题标题】:Extract terms, which are in a list, from text field in R从 R 中的文本字段中提取列表中的术语
【发布时间】:2017-02-07 16:30:50
【问题描述】:

我有一个关于字符串提取的问题。

我有一张下表:

Text
Monday is windy and raining
Tuesday is sunny
Wednesday is snowing and cold

我还有一个包含单词的列表:

windy
raining
sunny
snowing
cold

我想从表一中提取列表中的术语: 所以结果会是这样的:

Text                              Terms1      Terms2        Terms3
Monday is windy and raining       windy       raining
Tuesday is sunny                  sunny
Wednesday is snowing and cold     snowing     cold

在 R 中有什么方法可以做到吗?

谢谢

【问题讨论】:

  • 您可以创建一个for 循环并使用if term %in% table 选择要附加的术语。但是您需要决定如何存储输出,作为包含文本的术语列表,或插入表格单元格中的列表。通常,您不希望上述示例具有的表中有不同长度的行。将所有单词插入单元格中的单个列表可以解决此问题
  • term %in% table 不适用于在文本中搜索字符串,除非您将文本拆分为单独单词的向量...

标签: r string text extract


【解决方案1】:

给定一个单词向量:

> words
[1] "windy"   "raining" "sunny"   "snowing" "cold"   

还有一个带有text 列的数据框:

> data
                           text
1   Monday is windy and raining
2              Tuesday is sunny
3 Wednesday is snowing and cold

您可以轻松地为文本中出现的每个单词创建一个真/假值矩阵:

> sapply(words, function(w){grepl(w,data$text)})
     windy raining sunny snowing  cold
[1,]  TRUE    TRUE FALSE   FALSE FALSE
[2,] FALSE   FALSE  TRUE   FALSE FALSE
[3,] FALSE   FALSE FALSE    TRUE  TRUE

如果需要,您可以将其添加到数据框中:

> cbind(data, sapply(words, function(w){grepl(w,data$text)}))
                           text windy raining sunny snowing  cold
1   Monday is windy and raining  TRUE    TRUE FALSE   FALSE FALSE
2              Tuesday is sunny FALSE   FALSE  TRUE   FALSE FALSE
3 Wednesday is snowing and cold FALSE   FALSE FALSE    TRUE  TRUE

你给出的输出看起来像一个非常参差不齐的数据结构,作为一个列表可能是正确的,但除非你能澄清我给出的代码应该足以让你完成这个工作使用一些基本的 R 代码变成你想要的任何形式。查看grep 和朋友的帮助,了解如何在文本中搜索字符串。

【讨论】:

    【解决方案2】:
    library(stringr)
    library(stringi)
    
    Text <- c("Monday is windy and raining","Tuesday is sunny","Wednesday is snowing and cold")
    
    terms <- c("windy","raining","sunny","snowing","cold")
    terms_regex <- paste(terms,collapse="|")
    
    stri_list2matrix(sapply(Text,function(x,terms_regex) str_extract_all(x,terms_regex),terms_regex),byrow=TRUE)
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 2010-11-09
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2021-10-25
      • 2012-06-01
      相关资源
      最近更新 更多