read_excel правильно импортирует файл, но ошибка недопустимой многобайтовой строки при попытке поместить его в список

Когда я читаю любой лист из файла Posti-Letto-Istat .xls с read_excel из пакета readxl у меня проблем нет:

library(readxl)
pl_istat1 <- read_excel(path = "data/Posti-Letto-Istat.xls", sheet = 1, range = "A6:I66", na = "....")

Однако, если я попытаюсь использовать цикл lapply или for, чтобы все три листа были в списке, я получаю следующую ошибку.

lapply(1:3, function(i) read_excel(path = "data/Posti-Letto-Istat.xls", sheet = i, range = "A6:I66", na = "....")) 

Error in nchar(x, type = "width") : invalid multibyte string, element 4

Я вижу, что это проблема с кодировкой, и если я сделаю что-то вроде

names(pl_istat[[i]]) <- iconv(enc2utf8(names(pl_istat[[i]])),sub="byte")

на каждый лист, то у меня нет проблем.

Однако есть ли способ заставить список принимать tibble, который правильно импортируется readxl?

Информация о моем сеансе:

R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United 
States.1252    LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          

[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] readxl_1.0.0

loaded via a namespace (and not attached):
[1] magrittr_1.5     assertthat_0.2.0 R6_2.2.2         tools_3.3.3      bindrcpp_0.2     glue_1.1.1       dplyr_0.7.3      tibble_1.3.4     Rcpp_0.12.12    

[10] cellranger_1.1.0 rematch_1.0.1    pkgconfig_2.0.1  rlang_0.1.2      bindr_0.1     

person Max    schedule 30.09.2017    source источник
comment
дополнительный вопрос: есть ли какие-либо предложения о том, где хранить файл Excel для воспроизводимого примера, чтобы фактический путь можно было напрямую ввести в R?   -  person Max    schedule 30.09.2017
comment
Ваш код отлично работал для меня, используя файл, который вы связали. Я использую R 3.4.1 и Mac, поэтому возможно, что это проблема версии или системы. Что касается прямого ввода пути, я думаю, что это post может быть тем, что вы ищете, но я не уверен, что он действительно более воспроизводим.   -  person Brendan A.    schedule 30.09.2017
comment
Спасибо, Брендан. У меня не было возможности установить более новую версию. Я сообщу, решит ли это проблему и в Windows.   -  person Max    schedule 01.10.2017
comment
Я только что обновился до R 3.4.2 и получаю ту же ошибку. Так дело не в версии, может система?   -  person Max    schedule 17.10.2017
comment
Я работаю с бета-версией 3.5.1 и такой же   -  person Captain Tyler    schedule 26.09.2018


Ответы (2)


У меня была такая же ошибка, и я мог решить ее, обернув read_excel() с as.data.frame()

lapply(
  1:3, 
  function(i) {
    as.data.frame(
      read_excel(path = "data/Posti-Letto-Istat.xls", sheet = i, range = "A6:I66", na = "....")
    )
  }
) 
person sindri_baldur    schedule 04.09.2018
comment
Я давно не заглядывал в это, извините. Я собираюсь принять это. Надеюсь, лучше поздно, чем никогда. - person Max; 17.11.2020

У меня была аналогичная проблема при попытке сохранить таблицы, созданные с помощью readxl, в список. Поскольку у меня было несколько строк заголовков, я сначала прочитал только заголовки, соединил их и создал вектор с именем headers с именами столбцов. Затем считайте фактические данные с помощью read_excel и параметра col_names = FALSE. У меня не было проблем с сохранением этих «безымянных» табличек в список, но если бы я переименовал столбцы с помощью headers, я бы получил эту ошибку:

Error in nchar(x[is_na], type = "width") : 
  invalid multibyte string, element 1

Я решил это по проблеме, изменив кодировку перед переименованием таблицы:

headers <- enc2native(headers)

Но после этого, когда список печатается, я получаю это предупреждение:

In fansi::strwrap_ctl(x, width = max(width, 0), indent = indent,  :
  Encountered a C0 control character, see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.

что, по-видимому, вызвано ошибкой в ​​базе R согласно 1 и 2, и для меня это не было проблемой.

person DaríoM    schedule 07.08.2019