read_excel 正确导入文件,但 "invalid multibyte string" 尝试将其放入列表时出错
read_excel correctly imports file, but "invalid multibyte string" error when trying to put it on a list
当我使用 readxl
包中的 read_excel
从文件 Posti-Letto-Istat.xls 中读取任何 sheet 时,我没有遇到任何问题:
library(readxl)
pl_istat1 <- read_excel(path = "data/Posti-Letto-Istat.xls", sheet = 1, range = "A6:I66", na = "....")
但是,如果我尝试使用 lapply
或 for
循环将所有三个 sheet 放入列表中,我会收到以下错误。
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")
每个sheet,然后我就没问题了。
但是,有没有办法让列表接受 readxl
正确导入的 tibble
?
我的会话信息:
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
我有同样的错误,可以通过将 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 = "....")
)
}
)
我在尝试将使用 readxl
创建的小标题保存到列表中时遇到了类似的问题。
因为我有多个 header 行,所以我首先只读取 header 行,将它们连接起来并使用列名创建一个名为 headers
的向量。然后使用 read_excel
和参数 col_names = FALSE
读取实际数据。我将这些 "nameless" tibbles 保存到列表中没有问题,但如果我使用 headers
重命名列,我会收到此错误:
Error in nchar(x[is_na], type = "width") :
invalid multibyte string, element 1
我在重命名 tibble 之前通过更改编码解决了这个问题:
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.
当我使用 readxl
包中的 read_excel
从文件 Posti-Letto-Istat.xls 中读取任何 sheet 时,我没有遇到任何问题:
library(readxl)
pl_istat1 <- read_excel(path = "data/Posti-Letto-Istat.xls", sheet = 1, range = "A6:I66", na = "....")
但是,如果我尝试使用 lapply
或 for
循环将所有三个 sheet 放入列表中,我会收到以下错误。
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")
每个sheet,然后我就没问题了。
但是,有没有办法让列表接受 readxl
正确导入的 tibble
?
我的会话信息:
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
我有同样的错误,可以通过将 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 = "....")
)
}
)
我在尝试将使用 readxl
创建的小标题保存到列表中时遇到了类似的问题。
因为我有多个 header 行,所以我首先只读取 header 行,将它们连接起来并使用列名创建一个名为 headers
的向量。然后使用 read_excel
和参数 col_names = FALSE
读取实际数据。我将这些 "nameless" tibbles 保存到列表中没有问题,但如果我使用 headers
重命名列,我会收到此错误:
Error in nchar(x[is_na], type = "width") :
invalid multibyte string, element 1
我在重命名 tibble 之前通过更改编码解决了这个问题:
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.