2016-05-12 8 views
3

dies hier mein erster Beitrag ist, so bitte vergib irgendwelche Fehler, die Posting-Richtlinien wrtlapply auf Liste von XML-Objekten

Ich versuche, in XML-Daten aus pubmed, zu lesen, zu extrahieren Daten Autor Zugehörigkeiten

jeder Eintrag enthält einen Satz von Knoten, so wie:

<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> 
      ... 

Ich mag es mit einem Datenrahmen, um am Ende des jeden Namen und die Autoren Zugehörigkeit in einer Zeile enthält.

Ich habe versucht, dies mit xpathSApply zu tun, um Knoten zu lesen, die "// Author" lesen, und endete mit einer Liste von xml-Knoten.

Weitere Analyse erweist sich als ein Problem: Ich habe Code geschrieben, der auf ein einzelnes Element dieser Liste funktioniert;

für zB wenn die Liste authorlist

ist, kann ich eine entsprechende Anordnung für authorlist[[1]] extrahieren Sie diese Funktion verwenden (das verwendet xpathSApply innerhalb des Elements)

Aber wenn ich versuche lapply um diese Funktion zu wickeln, es gibt mir einen Fehler, der besagt, dass es xpathApply nicht in einer Liste ausführen kann. Der genaue Fehler Aufruf ist:

Fehler in UseMethod („xpathApply“): keine anwendbare Methode für ‚xpathApply‘ auf ein Objekt der Klasse „Liste“ angewendet

Ich vermute, dass lapply die Anrufe listet die Teilmenge mit dem Äquivalent von [i] auf, wohingegen ich [[i]] brauche. Gibt es einen Weg dahin? Oder muss ich mit einigen anderen Regeln neu schreiben?

Ich bin offen für das Neuschreiben (das ist nur ein bisschen herumalbern ich mache), aber dieses Problem schien interessant, hoffe, Sie können helfen!

Antwort

2

Ich bevorzuge die Verwendung des Pakets rvest bei der Arbeit mit HTML/XML-Dateien. Basierend auf Ihren einfaches Beispiel:

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) 

Wenn die Struktur der XML-Datei ändert, dann dann zu data.frame Befehl aufruft Fehler und einige weitere Arbeiten erforderlich, um die Datei zu analysieren.

+0

Vielen Dank! Ich werde dieses Paket erkunden, es sieht so aus, als würde es meine unmittelbaren Probleme lösen ... Aber gibt es auch einen Weg um das allgemeinere Problem, mit dem ich konfrontiert zu sein scheint? Ich bin mir nicht sicher, ob es etwas ist, das passieren würde, wenn man nicht mit dieser speziellen Struktur arbeitet ... –

+1

xml_nodes gibt einen Vektor mit allen Knoten mit diesem Tag zurück. Sie sollten lapply nicht verwenden müssen, wenn die Struktur konsistent ist. Beispiele finden Sie in der Dokumentation zu den Paketen rvest und xml2. – Dave2e

1

Es würde helfen, Ihren Code zu erhalten, die den Fehler produziert, aber man konnte 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> 
... 

versuchen Wenn Sie Knoten erhalten, die Null oder viele Tags haben, ich Tags NA in der Regel eine Funktion erstellen, einstellen fehlt und ein Trennzeichen zum Verbinden mehrerer Tags.

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> 
Verwandte Themen