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

昨天读取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语言)