这是一个真实的故事!
故事正文:
今天我在学习《R语言实战》这本书,学到了数据的输入,从带分隔符的文本文件导入数据,书中讲到了下面这个例子↓
听说学习R语言的好习惯就是要亲手键入代码,所以看到书中的例子我都会亲手在Rstudio里亲手输入代码,实际操作一遍,但是我没有上面的这个CSV文件,怎么办呢?做了多年会计的我,知道的唯一快捷方法就是在Excel表格中输入上面的内容,然后另存为CSV格式。
于是我就打开了Excel,一个字符一个字符的把书上的文件内容敲了进去,然后保存为了CSV。
接着我就按照书上的代码开始操作了,代码如下:
grades <- read.table("studentgrades.csv", header = TRUE,
row.names = "StudentID", sep = ",")
结果报错,如下:
我用Notepad++打开原文件看是不是文件字符有问题,但是并没有发现什么问题↓
我对文件进行了各种修改,比如删除引号,加上引号等等各种尝试,然后读取,折腾了一个多小时,还是无法读入。于是我就开始修改代码进行尝试。最终我把row.names
参数去掉,把文件读进来了,代码和结果如下:
grades <- read.table("studentgrades.csv", header = TRUE,
sep = ",")
grades
读是读进来了,可是可以看到第一行第一列StudentID的首字母变成了两个中文乱码,我又打开文件,把S删除,再次读入,乱码还是在那里,只是换了一个字符↓
我又进行了各种删除操作,这中文乱码就像打不死的小强一样,任我怎么删除,都删不掉,只是变换不同字符,一直在那里,真是气人啊!
于是我就把截图发给了大神,问他文件里有乱码读不进R怎么办?然后他就给我甩来了下面这篇公众号文章↓
我就打开文章看了看,原来是需要修改电脑的默认字符编码为英文,于是我就照葫芦画瓢,运行了一下文章里用的代码↓
Sys.setlocale()
Sys.setlocale("LC_ALL", "English")
把编码语言改成了英文↓
再一次读取文件↓
grades <- read.table("studentgrades.csv", header = TRUE,
sep = ",")
grades
结果如下↓
ε=ε=ε=(#>д<)ノ我真是哭笑不得了,乱码也跟着从中文乱码变成了英文乱码!真的是打不死的妖精了!!!
唉,这样折腾来折腾去,一上午时间都没了,又截图发给大神,他也不回我了,显然他太忙没空搭理我了。于是我就去吃中午饭去了。
下午回来,想到这个没解决的问题,我还是不甘心,无心做其他的事情。于是我又打开了Rstudio。现在已经找到了读取不来文件是因为有乱码存在,难道是我用Excel创建文件的时候不小心输入了什么肉眼无法看见的东西??那我就用其他方法再创建一个CSV文件试一下吧。
于是我就活学活用,使用上午刚学的edit()
函数再R中输入数据,然后保存为CSV文件↓
grades2 <- data.frame(StudentID = character(0),
First = character(0),
Last = character(0),
Math = numeric(0),
Science = numeric(0),
Social.Studies = numeric(0))
grades2 <- edit(grades2)
运行上面的函数,就出现了下面这个编辑器↓
我把内容填入上面的框框,关掉对话框,然后把这个grades2数据框写入CSV文件↓
write.table(grades2, "studentgrades2.csv", row.names = FALSE, sep = ",")
然后我的文件夹里就多了这个studentgrades2.csv,打开看一下是这样的↓
然后读取↓
read.table("studentgrades2.csv", header = TRUE,
row.names = "StudentID", sep = ",")
这回轻轻松松就读进来了↓
嘿嘿(*▽*),太高兴了! 不过这并没有解决第一个文件读不进来的问题。于是我就把第一个文件的内容全部删除,然后把第二个文件的内容全选复制粘贴进第一个文件内,保存,再次尝试读取。
还是跟之前一样的乱码o(╥﹏╥)o↓
我又重复了几遍全选复制粘贴,还是一样的结果。明明是一样的内容啊,为什么会这样??然后我分别选中两个文件,点击鼠标右键查看属性里文件的大小,果然——第一个文件比第二个文件大了3字节↓
我把第一个文档中的所有内容删除,再查看属性,大小还有3字节!!!真是活见鬼了!!!
真是奇怪了!奇怪了!正奇怪着,我发现Notepad++上面还有蛮多菜单栏的,我就想能不能在上面找到清空文件的按钮呢?找来找去没找到,但是我发现了下面这个菜单选项是可以修改的↓
对,就是这个Encoding菜单,我又去查看了一下文件2里是什么选项,发现果然和文件1的不一样↓
于是我把文件1修改为和文件2的一样,为Encode in UTF-8
。
果然!!!!!!!!
乱码没了! 文件可以读取了!!
这时我想起了我用Excel另存为CSV文件选择文件类型的时候似乎有看见这个UTF-8,于是我又去另存为看了看,果然有两种CSV文件可供选择↓
而我当时选择的是上面那个CSV UTF-8(逗号分隔),没有看见下面的那个CSV(逗号分隔),于是造成了今天的悲剧ε(┬┬﹏┬┬)3
记得以后,Excel保存CSV的时候一定要选择CSV(逗号分隔),不能选CSV UTF-8(逗号分隔)
虽然我不懂UTF-8到底是啥意思,不过通过我的摸索,总结了这么条经验,也算是功夫不负有心人了,嘿嘿!
也感谢这次的出错,让我有内容可以写出一个故事,O(∩_∩)O哈哈~