read_excel не будет обрезать пробелы

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

Файл можно загрузить непосредственно по ссылке ниже или, альтернативно, его можно загрузить через веб-сайт, где находится Приложение B.

http://www2.nationalgrid.com/UK/Industry-information/Future-of-Energy/Electricity-Ten-Year-Statement/

http://www2.nationalgrid.com/WorkArea/DownloadAsset.aspx?id=8589937799

require(readxl);require(tidyverse)
test <- read_excel("ETYS 2016 Appendix B.xlsx", skip = 1, sheet = 22, trim_ws = TRUE)
print(test$`MVAr Generation`)
test$`MVAr Generation` %>% str_count(patter = "\\s")

test$`MVAr Generation` %>% table #all are numeric
test$`MVAr Generation` %>% class #however the class is characer

test$`MVAr Generation` %>% str_count(patter = "\\s") %>%
sum(na.rm = T) #It should be 0 however it is 2 

Эта проблема вызывает проблемы при анализе, как видно из этого примера, в котором числовой столбец является символом. Помощь будет оценена по достоинству


person Jonno Bourne    schedule 23.05.2017    source источник


Ответы (3)


library(readxl)

readxl::excel_sheets('ETYS 2016 Appendix B.xlsx')[22]
test <- read_excel("ETYS 2016 Appendix B.xlsx", skip = 1, sheet = 22, 
                   trim_ws = FALSE)
test$`MVAr Generation` <- as.numeric(gsub('^\\s', "", test$`MVAr Generation`))

Ошибка, вероятно, связана с кодировкой символов. Я получаю эту ошибку, когда принудительно использую числовую интерпретацию столбца:

Expecting numeric in D9 / R9C4: got 'Â 225'

Вы можете вручную избежать этого, заменив начальные пробелы на gsub.

person troh    schedule 23.05.2017
comment
Хорошая идея с нераспознанными символами, однако это также удаляет числа с пробелами, поэтому не работает. - person Jonno Bourne; 25.05.2017

Возможно, это то, что вы хотите:

library(xlsx)
test <- read.xlsx("ETYS 2016 Appendix B.xlsx", sheetName = 22, 
              colIndex = 1:7, startRow = 2, header = TRUE, 
              stringsAsFactors = FALSE)

# remove whitespace
test <- data.frame(lapply(test, function(y) {
           y <- gsub("^\\s+", "", y); 
           y <- gsub("Â", "", y); y
           y <- gsub("^\\s+", "", y); 
           }))

# set tidy cols to numeric
cols = c(3, 4, 5, 7)
test[,cols] = apply(test[,cols], 2, function(x) as.numeric(x))

# test
class(test$Unit.Number)
test$MVAr.Absorption
person jay.sf    schedule 23.05.2017

Понимание @troh с кодировкой символов заставило меня задуматься об использовании регулярных выражений. Приложение @jaySF для всего фрейма данных было хорошим способом одновременной обработки всех столбцов. Два предложения привели меня к следующему ответу.

require(dplyr);require(purrr);require(readr)
RemoveSymbols <-function(df)  {
  df  %>% mutate_all( funs(gsub("^[^A-Z0-9]", "", ., ignore.case = FALSE))) %>%
     map_df(parse_guess) 
}

test2 <- RemoveSymbols(test)

sapply(test2,class)
person Jonno Bourne    schedule 25.05.2017