昨天读取csv文件又双叒叕失败了
问题描述
- 本来不同行的数据诡异的读到一个数据格子(姑且这么说吧)里了
- 数据内部的逗号被当成换行符处理了
2016/09/13更新
今天看到一个帖子朴素贝叶斯算法和R语言,用单引号”’”替换csv里的双引号’”’之后再用read.csv函数就不会出错了。。。。所以后面的内容不用看了。。。。。。
方案搜索
随便搜了下发现很多人都遇到过这个问题,但是没见到靠谱的方案
- 这篇文章从CSV文件中读取数据,使用逗号’,’分割问题 用正则表达式处理java中的csv文件读取。但是read.csv的
sep参数貌似不支持直接套正则表达式。我用的read.csv('data//sms_spam.csv',stringsAsFactors = FALSE, sep = ',(?=([^\\"]*\\"[^\\"]*\\")*[^\\"]*$)'),应该没写错表达式,但是报错invalid 'sep' value: must be one byte。 - 之前也有碰到过类似问题,当时在出错的那一列插入一空白列解决了——虽然并不明白为什么。这次失效
最后解决
最后搞定纯属瞎猫碰到死耗子。抱着试试的想法用Rstudio的import dataset功能直接导入,结果就这么成了。
自动导入用的readr包里的read_csv函数而不是常用的read.csv函数。dataset <- read_csv(……)
不知道适不适用其他人的情况的说
番外:关于readr包加载后出现的一个小bug
背景:数据框spam,第一列type是因子变量
正常操作时,如果要读取列a的level或者factor时,能想到的不外乎如下,其中第三种方式不支持。
#方式1
> levels(spam$type)
[1] "ham" "spam"
Levels: ham spam
> factor(spam$type[1:5])
[1] ham ham spam ham ham
Levels: ham spam
#方式2
> levels(spam[,1])
[1] "ham" "spam"
> factor(spam[,1][1:5])
[1] ham ham spam ham ham
#方式3
> levels(spam[1])
NULL
> factor(spam[1][1:5])
Error in `[.data.frame`(spam[1], 1:5) : 选择了未定义的列
但是加载readr包之后,方式2也不支持了
library(readr)
#方式1
> levels(spam$type)
[1] "ham" "spam"
> factor(spam$type[1:5])
[1] ham ham spam ham ham
Levels: ham spam
#方式2
> levels(spam[,1])
NULL
> factor(spam[,1])
Error in sort.list(y) : 'sort.list'的'x'必需为原子值
你是不是在串列上调用了'sort'函数?
#方式3
> levels(spam[1])
NULL
> factor(spam[1])
Error in sort.list(y) : 'sort.list'的'x'必需为原子值
你是不是在串列上调用了'sort'函数?
原因嘛我当然是不知道了~~~~
在尝试使用R语言读取csv文件时遇到了数据错位的问题,即逗号被错误地当作换行符处理。通过论坛帖子了解到,用单引号替换csv中的双引号可以解决问题。在尝试多种方案无效后,最终使用Rstudio的import dataset功能,自动导入时调用了readr包的read_csv函数成功读取了文件。
1540

被折叠的 条评论
为什么被折叠?



