问题
从逗号分割(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帮助页面。
|