2013-08-13 26 views
5

Ho un codice html e un codice R come questi e ho bisogno di correlare ogni valore del nodo al suo id genitore in un data.frame. Ci sono alcune informazioni diverse disponibili per ogni persona.R: Come ottenere gli attributi parent e i valori del nodo al momento del sito?

example <- "<div class='person' id='1'> 
<div class='phone'>555-5555</div> 
<div class='email'>[email protected]</div> 
</div> 
<div class='person' id='2'> 
<div class='phone'>123-4567</div> 
<div class='email'>[email protected]</div> 
</div> 
<div class='person' id='3'> 
<div class='phone'>987-6543</div> 
<div class='age'>32</div> 
<div class='city'>New York</div> 
</div>" 

doc = htmlTreeParse(example, useInternalNodes = T) 

values <- xpathSApply(doc, "//*[@class='person']/div", xmlValue) 
variables <- xpathSApply(doc, "//*[@class='person']/div", xmlGetAttr, 'class') 
id <- xpathSApply(doc, "//*[@class='person']", xmlGetAttr, 'id') 

# The problem: create a data.frame(id,variables,values) 

Con xpathSApply(), posso ottenere valori di telefono, e-mail, e di età così come persona attributi (id) troppo. Tuttavia, tali informazioni vengono isolate e ho bisogno di farle riferimento alla giusta variabile data.frame e alla persona giusta. Nei miei dati reali ci sono molte informazioni diverse, quindi questo processo di denominazione di ciascuna variabile deve essere automatico.

Il mio obiettivo è creare un data.frame come questo che rapporta ciascun ID ai propri dati.

id variables   values 
1 1  phone  555-5555 
2 1  email [email protected] 
3 2  phone  123-4567 
4 2  email [email protected] 
5 3  phone  987-6543 
6 3  age    32 
7 3  city  New York 

credo che avrei dovuto creare una funzione da utilizzare all'interno xpathSApply che sarebbe ottenere allo stesso tempo il telefono persona e la ID persona, in modo che sarebbero legati, ma non hanno avuto alcun successo con così lontano.

Qualcuno può aiutarmi?

risposta

7

In generale relativo non sarà facile:

idNodes <- getNodeSet(doc, "//div[@id]") 
ids <- lapply(idNodes, function(x) xmlAttrs(x)['id']) 
values <- lapply(idNodes, xpathApply, path = './div[@class]', xmlValue) 
attributes <- lapply(idNodes, xpathApply, path = './div[@class]', xmlAttrs) 
do.call(rbind.data.frame, mapply(cbind, ids, values, attributes)) 
    V1    V2 V3 
1 1  555-5555 phone 
2 1 [email protected] email 
3 2  123-4567 phone 
4 2 [email protected] email 
5 3  987-6543 phone 
6 3    32 age 
7 3  New York city 

Quanto sopra si dispone di attributo e coppie di valori assume di cui sono annidati un div con associato un id.

UPDATE: se si vuole avvolgerla in un tipo di chiamata xpathApply

utilFun <- function(x){ 
    id <- xmlGetAttr(x, 'id') 
    values <- sapply(xmlChildren(x, omitNodeTypes = "XMLInternalTextNode"), xmlValue) 
    attributes <- sapply(xmlChildren(x, omitNodeTypes = "XMLInternalTextNode"), xmlAttrs) 
    data.frame(id = id, attributes = attributes, values = values, stringsAsFactors = FALSE) 
} 
res <- xpathApply(doc, '//div[@id]', utilFun) 
do.call(rbind, res) 
    id attributes   values 
1 1  phone  555-5555 
2 1  email [email protected] 
3 2  phone  123-4567 
4 2  email [email protected] 
5 3  phone  987-6543 
6 3  age    32 
7 3  city  New York 
Problemi correlati