“编码错误是R语言编程实践中最常见、最烦人的一类错误,本文主要讲一下我遇到的编码错误以及解决办法,有全部代码和详细解释。”
R语言编码错误的表现
我最讨厌R语言的地方是它代码的可重用性很差。 上周,我打算使用read.csv()读取两年前保存的csv文件,出现以下错误:
Error in make.names(col.names, unique = TRUE) : invalid multibyte string at ''
将错误代码粘贴到搜索引擎中,会提示主要是编码错误造成的。
嗯? 为什么我写的 R 程序当时可以很好地读取这个文件,但现在却不能了? 这期间我重装了系统。 此问题可能是由于重新安装操作系统后系统的默认区域设置或字符编码发生更改所致。
百度有两种解决方案:
经过反复尝试,第一种方法并不合适,因为我的csv大小超过500MB,打开起来非常麻烦。 而且,我尝试制作一个小的csv样本,发现问题并没有解决。 R 的 read.csv() 仍然失败。 出了些问题。 我也尝试过方法二,但也没有效果。 好的! 经过多次研究和踩坑,终于解决了R语言文件编码的问题! 上车!
系统和编码
首先,每个国家或地区一般都有相应的编码格式。 安装操作系统时,会根据地区自动设置编码格式。 如果是在中国,一般是GBK格式或者格式。
GBK或者GBK是一个与GBK和编码兼容的字符编码标准吗? 它是一个支持简体字的中文字符集。 GBK 已进行扩展以支持更多字符。 它在GBK的基础上进一步扩展,支持更多的字符和更多的语言。 因此,可以看作是GBK和的超集。
以我的Win10系统为例,我想知道电脑现在使用什么编码格式? 以管理员身份打开并输入:
WINDOWSsystem32> chcp :
936 :
936表示机器是GBK格式,如果是65001,则是UTF-8格式。 UTF-8是国际上通用的8位字符集,是现在使用的主流。 为了避免将来出现编码问题,我建议以后将文件保存为UTF-8,这样烦人的编码问题就会消失,但是如果您已经遇到编码问题,请关注我。
R语言编码设置
如果您像我一样遇到了编码问题,您可以尝试以下步骤来解决此错误:
检查数据中是否包含非 ASCII 字符,如中文、日文、韩文等。如果是,请确保您的系统环境设置为正确的字符编码(如 UTF-8),以便正确处理这些字符。
首先检查R环境的编码设置是否正确。 在R的控制台中运行以下命令进行检查:
> Sys.getlocale()
[1] "LC_COLLATE=Chinese (Simplified)_China.936;LC_CTYPE=Chinese (Simplified)_China.936;LC_MONETARY=Chinese (Simplified)_China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_China.936"
结果显示编码不是UTF-8,需要设置为UTF-8。 您可以使用以下命令来设置它:
Sys.setlocale(category = "LC_ALL", locale = "en_US.UTF-8")
环境搭建好之后,我们来处理乱码文件。 read.csv函数读取csv文件时,会默认将文件中的字符编码转换为R语言字符编码。 如果系统默认的字符编码与文件的字符编码不一致,就会出现类似“ ”的错误。
重装系统后,系统默认的字符编码可能会改变,比如从UTF-8改为其他编码。 如果 CSV 文件中包含非 ASCII 字符(如中文、日文、韩文等),那么在读取该文件时可能会出现上述错误。
解决这个问题的一种方法是将R语言的字符编码设置为与CSV文件相同的编码。 我们可以使用Sys. R的控制台中的函数将R语言的字符编码设置为与文件相同的编码,例如:
Sys.setlocale(category = "LC_ALL", locale = "zh_CN.GB2312")
上面的代码设置了R语言的字符编码。 如果您的CSV文件也是以编码方式保存的,那么使用read.csv函数读取文件时就不会出现“ ”错误。
! 设置为Sys.( = "", = "us"),就不再报错了,但是打开文件后发现所有汉字都是乱码。 怎么解决呢?
如果我们将R语言的字符编码设置为英语环境的编码(例如“us”),那么当尝试读取包含非ASCII字符的CSV文件时,就会出现乱码。
解决这个问题的方法是将R语言的字符编码设置为与CSV文件相同的编码。 如果CSV文件以UTF-8编码保存,可以使用以下代码将R语言的字符编码设置为UTF-8:
Sys.setlocale(category = "LC_ALL", locale = "en_US.UTF-8")
如果你的CSV文件是以编码保存的,你可以使用下面的代码来设置R语言的字符编码:
Sys.setlocale(category = "LC_ALL", locale = "zh_CN.GB2312")
如果您的CSV文件以不同的编码保存,则需要将R语言的字符编码设置为与文件相同的编码。
首先,您可以尝试使用文本编辑器打开该文件并检查该文件的编码格式。 如果您使用的是操作系统,则可以使用记事本打开 CSV 文件并选择“另存为”选项来查看文件编码选项。 如果您使用其他文本编辑器,您可能需要检查编辑器的文档以了解如何查看文件的编码。
网上也有一些实用的工具,比如 ,可以下载安装。 如果您使用的是Linux或macOS操作系统,您可以通过在终端中运行以下命令来使用该工具来检测文件编码:
uchardet -c path/to/your/csv/file.csv
如果您使用的是操作系统,可以下载并安装该工具并在命令提示符中运行以下命令或:
uchardet -c pathtoyourcsvfile.csv
该命令将返回检测到的文件编码格式。
另外,如果CSV文件来自其他系统或软件,则文件头中可能包含编码信息。 您可以尝试打开CSV文件,查看文件头内容,看看是否包含编码信息。 例如,如果文件头包含以下行,则 CSV 文件将以 UTF-8 编码保存。
# encoding: utf-8
R语言乱码的处理
如果你和我一样,文件太大打不开,无法确定CSV文件的编码格式,你可以尝试使用一些工具进行自动检测。 例如R语言中的readr包提供了()函数,可以尝试自动检测文件的编码格式,例如:
library(readr)
guess_encoding('path/to/your/csv/file.csv')
# A tibble: 4 x 2
encoding confidence
1 GB18030 0.98
2 EUC-JP 0.67
3 EUC-KR 0.63
4 Big5 0.33
()函数属于readr包,用于猜测文本的编码格式。 根据输出,该函数将 file.csv 文件识别为编码的概率最高,置信度为 0.98。 同时,该函数还将文件识别为 EUC-JP、EUC-KR 和 Big5 编码,置信度分别为 0.67、0.63 和 0.33。
所以我们可以尝试使用该编码来打开文件,或者使用 iconv() 函数将文件转换为其他编码格式来打开。 如果你不确定应该使用哪种编码格式,可以尝试使用read.csv()函数的参数指定编码格式,或者使用readr包中的()函数,它可以自动识别多种编码格式。
该函数将返回检测到的编码格式,我们可以使用它来读取 CSV 文件,例如:
my_data <- read.csv("path/to/your/csv/file.csv", fileEncoding = "GB18030")
除了readr包中的()函数和工具外,R语言中还有一些其他的检测编码的工具和方法:
这些工具和方法可以用来检测文本的编码格式。 具体使用方法请参考相应包的文档或者函数帮助文档。
仔细看看两个csv读取函数
接下来,我很好奇为什么read.csv('xx.csv', = "")读取成功,但read.csv('xx.csv', = "")仍然显示错误:Error in make.names( col .names, = TRUE) : 位于 ''?
原因之一是R读取文件后处理列名时出现这个错误信息,可能与文件的编码格式无关。 无论使用 read.csv() 还是 readr::() 函数读取数据,如果数据框的列名中存在无效的多字节字符串,都可能会出现此错误。
如果使用read.csv()函数读取文件时指定了参数,并且文件的编码格式与参数指定的编码格式一致,那么读取数据应该没有问题。 但是,如果读取的数据帧的列名包含无效的多字节字符串,则在处理列名时仍然会出现上述错误。
因此,无论使用哪种方式读取数据,读取文件后都需要对数据帧的列名进行处理,将无效的多字节字符串替换为合法字符,以避免出现上述错误。
另一个原因是read.csv()和readr::()这两个函数在读取数据时处理数据的方式不同。
read.csv()函数读取数据时,会对数据进行自动类型推断,将所有字符变量的编码格式转换为UTF-8。 如果读取的数据中包含无法识别的字符,则在处理数据时可能会出现乱码等错误。
readr::()函数读取数据时,不会对数据进行自动类型推断,也不会将字符变量的编码格式转换为UTF-8。 相反,它尽可能保留数据的原始格式。 如果读取的数据包含无法识别的字符,则不会自动转换为乱码。
因此,使用read.csv()函数读取编码格式的文件时,可能会出现编码转换错误等问题。 然而,使用readr::()函数可以更好地保留原始数据的格式并避免这些问题。 。
总结
总之,R语言的编码错误导致乱码,非常麻烦。 一方面,以后要养成良好的编程习惯。 所有文件均应以 UTF-8 格式保存。 文件头中指定的编码是UTF-8。 不要使用系统默认编码。
另一方面,一旦出现乱码,切记不要随意操作。 一旦用其他编码格式保存乱码文件,就可能无法保存该文件。 别问我怎么知道的。
最后,不要尝试使用Excel来解决问题。 这是因为Excel默认遵循系统编码,使用Excel可能无法解决问题。
这个公众号是我们几个人为了督促自己不断学习,和各位爱好者交流而设立的。 如果您觉得我们的推送对您有帮助,请随时点赞、转发、阅读或点击文章中出现的链接。 广告支持我们的工作
参考
[1]我自己的总结和PPT
[2]R
好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。