分享

读取CSV文件

 微笑如酒 2017-12-27

 问题
从逗号分割(CSV)的文件中读取数据。
解决方案
用read.csv读取CSV文件。如果CSV文件有头部,就是这样用:

代码
1
> tbl <- read.csv("filename")

若CSV文件没有头部,就把header选项设为FALSE:

代码
1
> tbl <- read.csv("filename", header=FALSE)

讨论
像R、Excel等各种电子表格程序、很多数据库管理器、大部分的统计软件包都可以导入和导出CSV格式的文件,所以这种格式比较流行。CSV是一种表格数据的文本文件,每一行是一条数据,一条数据中的各个项目用逗号分隔。下面是一个简单的两行三列的CSV文件(第一行是头部,其中包含了各列的名称,也是用逗号分割的):

代码
1
2
3
4
label,lbound,ubound
low,0,0.674
mid,0.674,1.64
high,1.64,2.33

read.csv函数会读取文件中的数据,并创建一个用于存储数据的数据框(data frame)。在R中,常用数据框来表示表格数据。在默认情况下,该函数认为数据文件的第一行是表头:

代码
1
2
3
4
5
6
> tbl <- read.csv("table-data.csv")
> tbl
label lbound ubound
1 low 0.000 0.674
2 mid 0.674 1.640
3 high 1.640 2.330

read.csv函数会用表头中的内容给数据框中的各列命名。如果文件中没有表头,可以指定header=FALSE,这样R就会按序给各列命名(在这里就是V1、V2和V3):

代码
1
2
3
4
5
6
> tbl <- read.csv("table-data-with-no-header.csv", header=FALSE)
> tbl
   V1 V2 V3
1 low 0.000 0.674
2 mid 0.674 1.640
3 high 1.640 2.330

read.csv的一个特性是会自动地将非数值类型的数据视为因子(factor),即分类变量。这通常能满足大部分情况下的需求,毕竟R是一个统计软件,而不是Perl。tbl数据框中的label变量确实是因子,而不是字符。让我们来看看tbl的结构:

代码
1
2
3
4
5
6
> str(tbl)
'data.frame':
3 obs. of 3 variables:
$ label : Factor w/ 3 levels "high","low","mid": 2 3 1
$ lbound: num 0 0.674 1.64
$ ubound: num 0.674 1.64 2.33

但在某些情况下,也有可能确实需要字符串,而不是因子。把as.is参数设为TRUE即可,此时R就不会将分数值数据视为因子:

代码
1
2
3
4
5
6
7
> tbl <- read.csv("table-data.csv", as.is=TRUE)
> str(tbl)
'data.frame':
3 obs. of 3 variables:
$ label : chr "low" "mid" "high"
$ lbound: num 0 0.674 1.64
$ ubound: num 0.674 1.64 2.33

要注意,现在label标量是字符串,而不再是factor。另一个有用的特性是以井号(#)开始的行,即数据文件中的注释,都会被忽略。设置comment.char=”"可以禁用该功能。

read.csv函数还有很多有用的小技巧。例如,跳过输入文件的前若干行、控制每一列数据的转换、过滤较短的行、限制行数以及控制字符串的形式等等。详见R帮助页面。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多