问题
从逗号分割(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文件(第一行是头部,其中包含了各列的名称,也是用逗号分割的):
代码
label,lbound,ubound
low,0,0.674
mid,0.674,1.64
high,1.64,2.33
read.csv函数会读取文件中的数据,并创建一个用于存储数据的数据框(data frame)。在R中,常用数据框来表示表格数据。在默认情况下,该函数认为数据文件的第一行是表头:
代码
> 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):
代码
> 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的结构:
代码
> 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就不会将分数值数据视为因子:
代码
> 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帮助页面。
扩展阅读
请读者参阅read.table的R帮主页面,这是read.csv的基础。写CSV文件可以用write.csv函数。
本文采用「CC BY-SA 4.0 CN」协议转载自互联网、仅供学习交流,内容版权归原作者所有,如涉作品、版权和其他问题请给「我们」留言处理。