2017-08-16 1 views
0

J'essaye de construire une base de données avec 2 données que j'ai grattées sur IMDB: la première a 50 valeurs et la seconde n'en a que 29. Existe-t-il un moyen facile de demander à R de remplir automatiquement les autres 21 valeurs qu'il n'a pas trouvé?Grattage avec rvest: comment remplir des nombres vides dans une rangée pour les transformer dans un bloc de données?

Mon code:

imdb <- read_html("http://www.imdb.com/search/title?genres=horror&genres=mystery&sort=moviemeter,asc&view=advanced") 
title <- html_nodes(imdb, '.lister-item-header a') 
title <- html_text(title) 
metascore <- html_nodes(imdb, '.ratings-metascore') 
metascore <- html_text(metascore) 
df <- data.frame(Title = title, Metascore = metascore) 
Error in data.frame(Title = title, Metascore = metascore) : 
    arguments imply differing number of rows: 50, 29 

Merci!

Répondre

1

Vous devez changer votre quatrième ligne. Vous voulez metascore pour avoir autant d'éléments que title, avec NA pour ceux title qui n'ont pas de metascore. La façon de procéder consiste à extraire les nœuds item-content, puis, à partir de chacun d'eux, de sélectionner le nœud ratings-metascore s'il existe ou NA s'il ne l'est pas. Voir ?html_nodes pour la différence entre html_node et html_nodes. J'ai également ajouté span pour m'assurer que seul le nombre est retourné, sans le mot 'metascore' suivant.

imdb <- read_html("http://www.imdb.com/search/title?genres=horror&genres=mystery&sort=moviemeter,asc&view=advanced") 
title <- html_nodes(imdb, '.lister-item-header a') 
title <- html_text(title) 
metascore <- html_node(html_nodes(imdb, '.lister-item-content'), '.ratings-metascore span') 
metascore <- html_text(metascore) 
df <- data.frame(Title = title, Metascore = metascore) 

head(df,10) 
       Title Metascore 
1    Mother!  <NA> 
2 Annabelle: Creation 62   
3  Stranger Things  <NA> 
4   Supernatural  <NA> 
5     It  <NA> 
6 The Vampire Diaries  <NA> 
7    Get Out 84   
8  The Originals  <NA> 
9   Annabelle 37   
10    Grimm  <NA>