2014-02-08 3 views
0

Я ищу простой и эффективный способ преобразования XML-данных в виде data.frame (но не всех элементов).Преобразование XML в фрейм данных

У меня есть этот файл: http://www-sop.inria.fr/members/Philippe.Poulard/projet/2013/entries_hotels.xml

я использовал xpathSApply, но это плохо, потому что он не сохраняет нулевые элементы. В файле несколько широт пусты, но с xpathSApply Я не могу знать, какие отели имеют пустой элемент широты, потому что они игнорируются.

Я нашел функцию xmlToList, и это хорошо с XML, потому что она является prety той же структурой (во избежание много значений NULL в кадре данных).

Но теперь у меня есть 2 проблемы:

Если я хочу, чтобы создать фрейм данных из этого списка с утомительным списком элементов и сохранить элементы NULLS, как я могу сделать? я сделал это, но Нуль- не хранится в моем векторе:

library(XML) 
hotels <- "http://www-sop.inria.fr/members/Philippe.Poulard/projet/2013/entries_hotels.xml" 
list <- xmlToList(hotels) 
latitudes.hotels <- c() 
for(element in list) {latitudes.hotels <- c(latitudes.hotels, element$latitude)} 

И моя вторая проблема заключается в том, что если я хочу, чтобы работать непосредственно с моим списком, проблема в том, что все имена являются Sames: «вход ».
Тогда мне интересно, как я могу присоединиться к записи с Id равным x, например, which(list$entry$ID == x).
я могу сделать это с тем же типом вектора, чем выше

ids.hotels <- c() 
for(element in list) {ids.hotels <- c(ids.hotels, element$ID)} 
list[[which(ids.hotels == x)]] 

Но я думаю, что есть лучший способ сделать это, и это неправильно, если один элемент ID пуст в моем файле XML.

Спасибо за любую помощь

ответ

1

Я не знаком с пакетом XML, однако вы можете извлечь элементы, используя базовые функции и может сохранить недостающую долготы/широты.

lst <- xmlToList(hotels) 

ll <- lapply(1:150 , function(z) 
       c(id=lst[[z]][['ID']],name=lst[[z]][['name_fr']], 
       lat=lst[[z]][['latitude']],long=lst[[z]][['longitude']])) 

library(plyr) 
df <- rbind.fill(
      lapply(ll,function(y){as.data.frame(t(y),stringsAsFactors=FALSE)})) 

Получили rbind.fill отсюда: do.call(rbind, list) for uneven number of column

Также в то время как все имена в списке «запись», например, с использованием имен (LST [1]) для первых, вы можете получить имена по именам (lst [[1]])

+0

Спасибо, очень приятно быстро и эффективно! –

Смежные вопросы