Очистка таблицы с помощью html_table в R

Я хочу очистить таблицу взвешивания секторов по следующей ссылке:

http://portfolios.morningstar.com/fund/summary?t=SPY®ion=usa&culture=en-US&ownerCountry=USA

Таблица, которую я хочу, это таблица 6 в исходном коде веб-сайта. У меня есть следующий скрипт, написанный на R:

 library(rvest)
 turl = 'http://portfolios.morningstar.com/fund/summary?t=SPY'
 turlr = read_html(turl) 
 df6<-html_table(html_nodes(turlr, 'table')[[6]], fill = TRUE) 

Однако, когда я запускаю последнюю строку скрипта, я получаю следующее сообщение об ошибке

Ошибка в out[j + k, ] : нижний индекс выходит за пределы


person Talha Naushad    schedule 26.11.2017    source источник
comment
Вы должны увидеть Как создать минимальный, полный и проверяемый пример   -  person user10089632    schedule 27.11.2017
comment
Именно вы не включили важный код, вызвавший эту ошибку   -  person user10089632    schedule 27.11.2017
comment
В целевой таблице есть встроенные диаграммы и группы. Вам нужно будет изменить возвращенный узел, прежде чем он будет принят html_table. См. этот вопрос для получения некоторых рекомендаций.   -  person Kevin Arseneau    schedule 27.11.2017
comment
На SO есть почти бесчисленное количество сообщений R + скрапинг + Morningstar. В каких из них не было информации, которая могла бы вам помочь? Я постоянно озадачен этим, поскольку для создания q требуется больше энергии, чем для фактического поиска.   -  person hrbrmstr    schedule 27.11.2017


Ответы (1)


Поскольку требуемая таблица оформлена по-другому, rvest не может отформатировать ее в правильную таблицу. Но с помощью пакета XML вы можете сделать это довольно легко.

library(XML)
library(dplyr)

#read required table
turl = 'http://portfolios.morningstar.com/fund/summary?t=SPY'
temp_table <- readHTMLTable(turl)[[6]]

#process table to readable format
final_table <- temp_table %>%
  select(V2, V3, V4, V5) %>%
  na.omit() %>%
  `colnames<-` (c("","% Stocks","Benchmark","Category Avg")) %>%
  `rownames<-` (seq_len(nrow(.)))
final_table

Выход:

                          % Stocks Benchmark Category Avg
1                Cyclical                                
2         Basic Materials     2.79      3.16         3.22
3       Consumer Cyclical    11.06     11.42        11.15
4      Financial Services    16.39     16.50        17.22
5             Real Estate     2.24      3.18         2.00
6               Sensitive                                
7  Communication Services     3.56      3.37         3.50
8                  Energy     5.83      5.79         5.79
9             Industrials    10.37     10.89        11.70
10             Technology    22.16     21.41        19.72
11              Defensive                                
12     Consumer Defensive     8.20      7.60         8.56
13             Healthcare    14.24     13.57        14.57
14              Utilities     3.15      3.11         2.59

Надеюсь, поможет!

person 1.618    schedule 27.11.2017
comment
Это замечательно. Большое спасибо! - person Talha Naushad; 28.11.2017