首页 > 解决方案 > 如何从嵌套列表中提取单词对

问题描述

我有一个数据框,其中有一列包含句子列表(嵌套列表)

目标

其中一些句子包含我拥有的一个参考列表中的单词,一些来自第二个列表,还有一些来自两者。我想从每个句子中的两个单词列表中提取所有单词,如果它们都出现在每个句子中,则将它们加入。

例子

ReportText1<-list(c("4 oesophagus biopsies.","Three EMRs seen"))
ReportText2<-list("stomach EMRx1")
ReportText3<-list("stomach biopsy seen pinned on cork","three biopsies")
ReportText<-c(ReportText1, ReportText2,ReportText3)

ReportID         Report_Text
1                [1] 4 oesophagus biopsies.
                 [2] Three EMRs seen
2                [1] stomach EMRx1
3                [1] stomach biopsy seen pinned on cork
                 [2] three biopsies

期望的输出

ReportID         Report_Text                             Output
1                [1] 4 oesophagus biopsies.              oesophagus:biopsies,EMR:
                 [2] Three EMRs seen                     
2                [1] stomach EMRx1                       stomach:EMR
3                [1] stomach biopsy seen pinned on cork  stomach:biopsy,biopsies:
                 [2] three biopsies                    

我正在使用的列表:

获取样本类型(即活检或 EMR 等)。

HistolType <- function() {
  
  #First standardise the terms
  
    tofind <-
      paste(
        c(
          "Resection","Biopsy","EMR","ESD","bx","biopsy","biopsies"),
        collapse = "|"
      )
    return(tofind)
  }

获取标本的位置

LocationList<-function(){
  
  tofind <-
    paste(
      c(
        
        "Stomach","Antrum","Duodenum","Oesophagus","GOJ"
      ),
      collapse = "|"
    )
  
  return(tofind)
  
}

试图

我假设该方法应该是使用嵌套lapply但我似乎无法在嵌套中应用提取lapply。内部lapply似乎没有单独遍历每个句子并连接每个句子,它只在末尾连接

lapply(SelfOGD_Dunn2$Macroscopy, function (x) 
        lapply(x, function(y) paste(
             str_extract_all(tolower(y),tolower(LocationList())),":",
             str_extract_all(tolower(y),tolower(HistolType())))))

实际输出

ReportID         Report_Text                             Output
1                [1] 4 oesophagus biopsies.              "c(\"oesophagus\" : c(\"EMR\", \"bx\")"
                 [2] Three EMRs seen                     
2                [1] stomach EMRx1                       stomach : EMR
3                [1] stomach biopsy seen pinned on cork  "c(\"stomach\" : c(\"biopsy\", \"biopsies\")"
                 [2] three biopsies 

               

我想另一种方法是分别提取每个列表以及找到该单词的句子的索引,然后根据索引合并?如果有人知道如何做到这一点,我很想知道。

标签: r

解决方案


使用嵌套lapply,您需要collapse从内部列表中输出列表项:

lapply(ReportText, function (x) 
               paste( lapply(x, function(y) 
                                 paste(
                                      str_extract_all(tolower(y),tolower(LocationList()), simplify = T),":",
                                      str_extract_all(tolower(y),tolower(HistolType()), simplify = T))
                                      ), 
                                      collapse = ","
                    )

      )

#[[1]]
#[1] "oesophagus : biopsies, : emr"
#
#[[2]]
#[1] "stomach : emr"
#
#[[3]]
#[1] "stomach : biopsy"
#
#[[4]]
#[1] " : biopsies"

推荐阅读