[英]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.