簡體   English   中英

lapply在xml對象列表上

[英]lapply on list of xml objects

這是我在這里的第一篇文章,所以請原諒發布指南中的任何錯誤

我正在嘗試從pubmed讀取xml數據,以提取作者關聯的數據

每個條目都包含一組節點,如下所示:

<AuthorList>
          <Author>
            <LastName>Serra-Blasco</LastName>
            <ForeName>Maria</ForeName>
            <Initials>M</Initials>
            <AffiliationInfo>
              <Affiliation>Department of Psychiatry, Hospital de la Santa Creu i Sant Pau, Biomedical Research Institute Sant Pau (IIB Sant Pau), Universitat Autònoma de Barcelona (UAB), Centro de Investigación Biomédica en Red de Salud Mental (CIBERSAM), Barcelona, Catalonia, Spain.</Affiliation>
            </AffiliationInfo>
          </Author>
          ...

我想最終得到一個數據框,其中包含連續的每個作者姓名和從屬關系。

我嘗試使用xpathSApply來解析讀取“// Author”的節點,最后得到一個xml節點列表。

進一步解析被證明是一個問題:我編寫的代碼適用於此列表的單個元素;

例如,如果列表是authorlist列表

我可以使用這個函數(在元素中使用xpathSApply)為authorlist[[1]]提取一個合適的數組

但是當我嘗試在這個函數周圍進行包裝時,它會給出一個錯誤,指出它無法在列表上執行xpathApply。 確切的錯誤調用是:

UseMethod(“xpathApply”)中的錯誤:沒有適用於“xpathApply”的方法應用於類“list”的對象

我推測lapply稱之為[i]等價的列表子集,而我需要的是[[i]]。 有沒有解決的辦法? 或者我是否必須重寫其他一些規則?

我願意改寫(這只是我正在做的一些事情),但這個問題似乎很有意思,希望你能幫忙!

在使用html / xml文件時,我更喜歡使用rvest包。 基於您的簡單示例:

library(rvest)
myxml<-read_xml("author.xml")

lastname<-xml_text(xml_nodes(myxml,"LastName"))
firstname<-xml_text(xml_nodes(myxml,"ForeName"))
affiliation<-xml_text(xml_nodes(myxml,"Affiliation"))
df<-data.frame(firstname, lastname, affiliation)

如果xml文件的結構發生更改,則調用data.frame命令將出錯,並且需要一些額外的工作才能正確解析該文件。

這將有助於顯示產生錯誤的代碼,但您可以嘗試xmlToDataFrame

url <- "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=23620451&rettype=XML"
doc <- xmlParse(url)

xmlToDataFrame(doc["//Author"])
           LastName ForeName Initials                   AffiliationInfo
1      Serra-Blasco    Maria        M Department of Psychiatry...Spain.
2          Portella  Maria J       MJ                              <NA>
3       Gómez-Ansón  Beatriz        B                              <NA>
...

如果您獲得具有零個或多個標記的節點,我通常會創建一個函數來將缺少的標記設置為NA,並使用分隔符來連接多個標記。

authors <- getNodeSet(doc, "//Author")

xpath2 <-function(x, path){
     y <- xpathSApply(x, path, xmlValue)
     ifelse(length(y)==0, NA, 
        ifelse(length(y)>1, paste(y, collapse=", "), y))
}

last <- sapply(authors, xpath2, ".//LastName")
aff <- sapply(authors, xpath2, ".//Affiliation")
data.frame(last, aff)
               last                               aff
1      Serra-Blasco Department of Psychiatry...Spain.
2          Portella                              <NA>
3       Gómez-Ansón                              <NA>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM