Чтение набора данных с веб-сайта в числовом формате, а не в символьном формате - PullRequest
0 голосов
/ 15 мая 2018

С помощью приведенного ниже кода я считываю данные с веб-сайта.
Проблема заключается в том, что данные считываются в формате character, а не в формате numeric, особенно в некоторых столбцах, таких как "Enlem (N) и Boylam (E)".

Как я могу это исправить?

library(rvest)

widths <- c(11,10,10,10,14,5,5,5,48,100)
dat <- "http://www.koeri.boun.edu.tr/scripts/lst5.asp" %>%
    read_html %>%
    html_nodes("pre") %>%
    html_text %>%
    textConnection %>%
    read.fwf(widths = widths, stringsAsFactors = FALSE) %>%
    setNames(nm = .[6,]) %>%
    tail(-7) %>%
    head(-2)

1 Ответ

0 голосов
/ 15 мая 2018

Если вы знаете, какие столбцы должны быть числом, вы можете преобразовать эти столбцы в число.Если вы не знаете, какие столбцы должны быть числом, вы можете создать функцию для просмотра данных, и если достаточно большой процент случаев в столбце является числом, измените этот столбец на число.Для этой цели я использовал приведенную ниже функцию:

NumericColumns <- function(x, AllowedPercentNumeric =.95, PreserveDate=TRUE, PreserveColumns){

  # find the counts of NA values in input data frame's columns
  param_originalNA <- apply(x, 2, function(z){sum(is.na(z))})

  # blindly coerce data.frame to numeric
  df_JustNumbers <- suppressWarnings(as.data.frame(lapply(x, as.numeric)))

  # Percent Non-NA values in each column
  PercentNumeric <- (apply(df_JustNumbers, 2, function(x)sum(!is.na(x))))/(nrow(x)-param_originalNA)

  rm(param_originalNA)

  # identify columns which have a greater than or equal percentage of numeric as specified
  param_numeric <- names(PercentNumeric)[PercentNumeric >= AllowedPercentNumeric]

  # Remove columns from list to convert to numeric that are specified as to preserve
  if (!missing(PreserveColumns)){param_numeric <- setdiff(param_numeric, PreserveColumns)}

  # Identify columns that are dates initially
  IsDateColumns <- lapply(x, function(y)(is(y, "Date")|is(y, "POSIXct")))
  param_dates <- names(IsDateColumns)[IsDateColumns==TRUE]

  # Remove dates from list if specified to preserve dates
  if (PreserveDate){param_numeric <- setdiff(param_numeric, param_dates)}

  # returns column position of numeric columns in target data frame
  param_numeric <- match(param_numeric, colnames(df_JustNumbers))

  # removes NA's from column list
  param_numeric <- param_numeric[complete.cases(param_numeric)]

  # coerces columns in param_numeric to numeric and inserts numeric columns into target data.frame
  if(length(param_numeric)==1){
    suppressWarnings(x[, param_numeric] <- as.numeric(x[, param_numeric]))
  }

  if(length(param_numeric)>1){
    suppressWarnings(x[, param_numeric] <- apply(x[, param_numeric],2, function(x)as.numeric(x)))
  }

  return(x)
}

После создания функции вы можете использовать ее для данных, таких как:

# Use function to convert to numeric 
dat <- NumericColumns(dat)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...