2016-05-13 3 views
0

У меня возникают проблемы с чтением узла XML с использованием R в фрейм данных. Я новичок в чтении в XML-данных.Преобразование XML-строки в dataframe в R

Это то, что мне удалось получить:

require(dplyr) 
require(rvest) 
url <- "http://rstudio-pubs-static.s3.amazonaws.com/177866_49f6965521224dd883df5f20f9c32db3.html" 
x <- read_html(url) %>% 
    html_node("code") %>% 
    html_text() 

x1 <- gsub("##", "", x) 
df <- read.table(text = x1, fill = TRUE, sep = "\n", header=TRUE, allowEscapes = TRUE)` 

Однако, похоже, read.table() уходят некоторые наблюдения и не ограничивающие несколько строк.

Все, что я получаю текст XML в простой фрейм данных. Хотелось бы получить некоторое представление о том, как лучше обрабатывать этот материал XML.

+1

Существует подозрительно называется 'XML' пакет ... – lmo

+0

Эта страница является боль в ***. Набор данных был обернут уценкой, так что на самом деле он оказался сложным. Нет никакого способа, чтобы вы прочитали его правильно, не выполняя некоторую реконструкцию или не читая 500 строк за один раз, а затем свяжите их. Похоже, что есть три набора из 500 –

+0

Да, я знаю о пакете XML и использовал его и, как и расположение пакета rvest, лучше. Мне удалось справиться с строкой, чтобы прочитать ее, и strsplit с разделителем «\ n»; однако, если смотреть вниз, похоже, что 250 строк были разделены на новую строку с помощью «\ n». Я собирался прочитать все это и сделать некоторые преобразования. У меня просто проблемы с чтением на всех 1500 линиях отдельно и можно использовать некоторую помощь. – KenDazzo

ответ

0

Я бы расколоть pre/code узел в вектор, а затем прочитать 3 часть таблицы, как комментарии предложили

x1 <- strsplit(x, "\n## *")[[1]] 

Это фиксированные поля ширины, так что используйте read.fwf для первых двух (последнего таблица не имеет каких-либо дополнительных пробелов)

length(x1) 
[1] 1503 

x1[2] 
"1 Espresso Leggero   6  2.54   0   1" 

zz <- textConnection(x1[2:501]) 
df1 <- read.fwf(zz, widths=c(3, 18, 10, 12, 12, 13)) 
close(zz) 
names(df1) <- c("Id", strsplit(x1[1], " +")[[1]][-1]) 
head(df1) 
    Id    Flavor Intensity WaterVolume CreamVolume SugarPackets 
1 1 Espresso Leggero   6  2.54   0   1 
2 2   Ristretto   9  0.85   2   0 
3 3   Ristretto   9  0.85   1   3 
4 4  Lungo Forte   4  1.35   2   0 
5 5  Lungo Leggero   2  0.85   1   1 
6 6  Lungo Leggero   2  0.85   2   4 

zz <- textConnection(x1[503:1002]) 
df2 <- read.fwf(zz, widths=c(3, 10, 10, 13, 10, 11, 13)) 
close(zz) 
names(df2) <- c("Id", strsplit(x1[502], " +")[[1]]) 

df3 <- read.table(text = x1[1004:1503]) 
names(df3) <- c("Id", strsplit(x1[1003], " +")[[1]]) 

coffee <- cbind(df1, df2[,-1], df3[,-1]) 
+0

Спасибо за отличную помощь. Крис С. Отлично работал! – KenDazzo

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