Очистка таблицы википедии - PullRequest
2 голосов
/ 18 июня 2020

Я скопировал таблицу википедии, используя r

library(rvest)

url <- "https://en.wikipedia.org/wiki/New_York_City"
nyc <- url %>%
  read_html() %>%
  html_node(xpath = '//*[@id="mw-content-text"]/div/table[1]') %>%
  html_table(fill = TRUE)

И хочу сохранить значения в новый фрейм данных.

Вывод

Area           population
468.484 sq mi  8,336,817

Что лучше как это сделать?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Вам нужно выбрать, какой стол. Из таблицы выберите нужные столбцы и строки. Назначьте имена столбцов, используя setNames, и сбросьте rownames, установив для них значение NULL. Я уверен, что вам нужен population столбец as.integer, просто используйте gsub перед тем, как очистить нецифровые символы.

Я не уверен насчет строки html_node и оставил ее.

library(rvest)

url <- "https://en.wikipedia.org/wiki/New_York_City"

nyc <- read_html(url)
# nyc <- html_node(nyc, xpath = '//*[@id="mw-content-text"]/div/table[1]')
nyc <- html_table(nyc, header=TRUE, fill = TRUE)

nyc <- `rownames<-`(
  setNames(nyc[[3]][-c(1:2, 10), 2:3], c("area", "population")), 
  NULL)
nyc <- transform(nyc, population=as.integer(gsub("\\D", "", population)))
nyc
#                area population
# 1             Bronx    1418207
# 2             Kings    2559903
# 3          New York    1628706
# 4            Queens    2253858
# 5          Richmond     476143
# 6  City of New York    8336817
# 7 State of New York   19453561
0 голосов
/ 18 июня 2020

Судя по выходным данным примера OP, они хотят, чтобы таблица была предоставлена ​​с другим xpath, чем тот, который они предоставили в вопросе. См. Следующий рабочий процесс, обратите внимание: имена были заданы вручную, чтобы не беспокоиться о форматировании строк из строк:

# Initialise package in session: rvest => .GlobalEnv()
library(rvest)

# Store the url scalar: url => character vector 
url <- "https://en.wikipedia.org/wiki/New_York_City"

# Scrape the table and store it memory: nyc => data.frame
nyc <- 
  url %>%
  read_html() %>%
  html_node(xpath = '/html/body/div[3]/div[3]/div[4]/div/table[3]') %>%
  html_table(fill = TRUE) %>% 
  data.frame()

# Set the names appropriately: names(nyc) character vector
names(nyc) <- c("borough", "county", "pop_est_2019", 
                "gdp_bill_usd", "gdp_per_cap", 
                "land_area_sq_mi", "land_area_sq_km", 
                "density_pop_sq_mi", "density_pop_sq_km")

# Coerce the vectors to the appropriate type: cleaned => data.frame
cleaned <- data.frame(lapply(nyc[4:nrow(nyc)-1,], function(x){ 
    if(length(grep("\\d+\\,\\d+$|^\\d+\\.\\d+$", x)) > 0){
      as.numeric(trimws(gsub("\\,", "", as.character(x)), "both"))
    }else{ 
      as.factor(x)
      }
    }
  )
)
...