如何从嵌套列表中提取单词对

时间:2019-01-05 16:35:05

标签: r

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

目标

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

示例

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 

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

2 个答案:

答案 0 :(得分:1)

使用嵌套的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"

答案 1 :(得分:1)

由于这些元素是从相应的paste元素中liststr_extract_all返回了list输出),我们可以使用Map

lapply(SelfOGD_Dunn2$Macroscopy, function (x)
   lapply(x, function(y) 
     Map(paste, str_extract_all(tolower(y),tolower(LocationList())), 
                str_extract_all(tolower(y),tolower(HistolType())),
          MoreArgs = list(sep=":"))))