Создать фрейм данных из списков, которые являются неравномерными - PullRequest
0 голосов
/ 12 декабря 2018

В приведенном ниже коде я копирую данные из IMDB с нескольких страниц, однако, когда я пытаюсь объединить данные в один фрейм данных, он выдает ошибку, сообщающую мне разные строки для общего и мета.Мне было интересно, как бы я вставил значения NA в эти пустые места, чтобы строки были равны по длине?(Обратите внимание, я должен удалить некоторые ссылки, потому что мне нужен определенный представитель, чтобы публиковать больше ссылок)

urls <- c("https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=51&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=101&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=151&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=201&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=251&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=301&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=351&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=401&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=451&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=501&ref_=adv_nxt",
              "https://www.imdb.com/search/title?title_type=feature&release_date=2010-01-01,2017-12-31&start=551&ref_=adv_nxt",
              "https://www.imdb.com/search/title?
              )


    results_list <- list()

    for(.page in seq_along(urls)){
      webpage <- read_html(urls[[.page]])
      titlehtml <- html_nodes(webpage,'.lister-item-header a')
      title <- html_text(titlehtml)
      runtimehtml <- html_nodes(webpage,'.text-muted .runtime')
      runtime <- html_text(runtimehtml)
      runtime <- gsub(" min","",runtime)
      ratinghtml <- html_nodes(webpage,'.ratings-imdb-rating strong')
      rating<- html_text(ratinghtml)
      voteshtml <- html_nodes(webpage,'.sort-num_votes-visible span:nth-child(2)')
      votes <- html_text(voteshtml)
      votes<-gsub(",","",votes)#removing commas
      metascorehtml <- html_nodes(webpage,'.metascore')
      metascore <- html_text(metascorehtml)
      metascore<-gsub(" ","",metascore)#removing extra space in metascore
      grosshtml <- html_nodes(webpage,'.ghost~ .text-muted+ span')
      gross <- html_text(grosshtml)
      gross<-gsub("M","",gross)#removing '$' and 'M' signs
      gross<-substring(gross,2,6)

      results_list[[.page]] <- data.frame(Title = title,
                                          Runtime = as.numeric(runtime),
                                          Rating = as.numeric(rating),
                                          Metascore = as.numeric(metascore), 
                                          Votes = as.numeric(votes), 
                                          Gross_Earning_in_Mil = as.numeric(unlist(gross))
                                          )
    }

    final_results <- plyr::ldply(results_list)

    Error in data.frame(Title = title, Runtime = as.numeric(runtime), Rating = as.numeric(rating),  : 
      arguments imply differing number of rows: 50, 49, 48

1 Ответ

0 голосов
/ 12 декабря 2018

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

Глядя на страницу, кажется, что они аккуратно организованы в узлы "lister-item-content", поэтомуЧистая вещь, которую нужно сделать - это сначала извлечь эти узлы, и только потом извлекать дополнительную информацию из каждого модуля отдельно.Что-то вроде этого работает для меня:

items <- html_nodes(webpage,'.lister-item-content')
gross <- sapply(items, function(i) {html_text(html_node(i, '.ghost~ .text-muted+ span'))})

Он вставляет NA в каждое место, где «items» не содержит искомого заголовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...