[R] csv文件读取之逗号分隔符相关

来源:互联网 发布:无忧保姆 知乎 编辑:程序博客网 时间:2024/06/15 07:54

昨天读取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'函数?

原因嘛我当然是不知道了~~~~

原创粉丝点击