8

我使用该write.xlsx()函数(来自openxlsx包)将列表对象转换为 excel 电子表格,其中列表的每个元素都转换为 excel 文件的“工作表”。在过去,这个功能非常有用,我从来没有遇到任何问题。据我了解,这个包和功能特别不需要在计算机上进行任何特定的 java 更新即可工作。

但是,最近我发现该函数正在产生错误。这是当我为列表运行 write.xlsx() 时它在控制台中的状态:

Error in gsub("&", "&", v, fixed = TRUE) : 
  input string 5107 is invalid UTF-8

我已经确定了导致问​​题的数据帧,但我不确定如何确定数据帧的哪一部分导致了错误。

我什至继续enc2utf8()对这个数据框中的所有列使用该函数,但我仍然遇到错误。我已经substr()在数据框本身上使用了该函数,它向我显示了n每列的第一个字符,尽管我没有从输出中看到任何明显的问题。

我什至继续使用该install.packages()功能再次重新下载openxlsx包,以防有任何更新。

有谁知道我将如何确定错误的原因?它是包装中写的功能吗?如果问题出在数据本身的编码上,这enc2utf8()还不足以解决问题吗?

谢谢!

4

2 回答 2

9

我刚遇到同样的问题。基于这个问题,您可以将数据框中的所有坏字符替换为:

library(dplyr)
df %>%
  mutate_if(is.character, ~gsub('[^ -~]', '', .))

仅用于字符列,或:

df %>%
  mutate_all(~gsub('[^ -~]', '', .))  

对于所有列,然后使用write.xlsx(). 导出到 XLSX

于 2018-09-14T13:35:24.760 回答
1

至于找到错误,给定的数字将您指向问题(在您的情况下为 5107)。这似乎是在计算写入文件的字符串。为了找到问题所在的特定数据点,这种方法对我有用:

假设我们的数据框有 20 个变量,其中 10 个是字符类型。

  • 减去变量的数量,如果您正在编写列标题(因为所有这些都是字符串)5107-20 = 5087
  • 将余数除以每次观察的字符变量数(5087/10 = 508.7);这意味着问题出在第 509 行(因为标题和前 508 行之间有 5080+20=5100 个字符串)
  • 第 509 行中的第 7 个字符变量将是您的问题孩子。
于 2020-01-09T12:09:53.953 回答