R语言基础教程 | 文件的输入与输出

做生物信息分析,少不了的就是数据,比如转录组的数据,无论是下载的还是测序的,用R进行分析,就必须将这些数据读入,分析的结果,比如一些图,就少不了输出,因此,文件的读写在数据分析中是比较常用的。

一、读写文件

1. 从文件中读取数据库或矩阵

read.table()函数是R最基本函数之一,主要用来读取矩形表格数据。

Usage
read.table(file, header = FALSE, sep = "", quote = "\"'",
           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
           row.names, col.names, as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

各参数的说明如下:

(1)file

file是一个带分隔符的ASCII文本文件。

(2)header

一个表示文件是否在第一行包含了变量的逻辑型变量。

如果header设置为TRUE,则要求第一行要比数据列的数量少一列。

(3)sep

分开数据的分隔符。默认sep=""。

read.table()函数可以将1个或多个空格、tab制表符、换行符或回车符作为分隔符。

(4)quote

用于对有特殊字符的字符串划定接线的字符串,默认值是TRUE(")或单引号。(`)

(5)dec

decimal用于指明数据文件中小数的小数点。

(6)numerals

字符串类型。用于指定文件中的数字转换为双精度数据时丢失精度的情况下如何进行转换。

(7)row.names

保存行名的向量。可以使用此参数以向量的形式给出每行的实际行名。或者要读取的表中包含行名称的列序号或列名字符串。

在数据文件中有行头且首行的字段名比数据列少一个的情况下,数据文件中第1列将被视为行名称。除此情况外,在没有给定row.names参数时,读取的行名将会自动编号。

可以使用row.names = NULL强制行进行编号。

(8)col.names

指定列名的向量。缺省情况下是又"V"加上列序构成,即V1,V2,V3......

Tip:

rownames、colnames是base包中的行名、列名函数;

而row.names、col.names是read.table函数中的行名、参数

(9)as.is

该参数用于确定read.table()函数读取字符型数据时是否转换为因子型变量。当其取值为FALSE时,该函数将把字符型数据转换为因子型数据,取值为TRUE时,仍将其保留为字符型数据。其取值可以是逻辑值向量(必要时可以循环赋值),数值型向量或字符型向量,以控制哪些列不被转换为因子。

注意:可以通过设置参数 colClasses = "character"来阻止所有列转换为因子,包括数值型的列。

(10)na.strings

可选的用于表示缺失值的字符向量。

na.strings=c("-9","?")把-9和?值在读取数据时候转换成NA

(11)colClasses

用于指定列所属类的字符串向量。

(12)nrows

整型数。用于指定从文件中读取的最大行数。负数或其它无效值将会被忽略。

(13)skip

整型数。读取数据时忽略的行数。

(14)check.names

逻辑值。该参数值设置为TRUE时,数据框中的变量名将会被检查,以确保符在语法上是有效的变量名称。

(15)fill

逻辑值。在没有忽略空白行的情况下(即blank.lines.skip=FLASE),且fill设置为TRUE时,如果数据文件中某行的数据少于其他行,则自动添加空白域。

(16)strip.white

逻辑值,默认为FALSE。此参数只在指定了sep参数时有效。当此参数设置为TRUE时,数据文件中没有包围的字符串域的前边和后边的空格将会被去掉。

(17)blank.lines.skip

逻辑值,此参数值设置为TRUE时,数据文件中的空白行将被忽略。默认值为TRUE。

(18)comment.char

字符型。包含单个字符或空字符的向量。代表注释字符的开始字符。可以使用""关闭注释。

(19)allowEscapes

逻辑值。类似“\n”这种C风格的转义符。如果这种转义符并不是包含在字符串中,该函数可能解释为字段分隔符。

(20)flush

逻辑值。默认值为FALSE。当该参数值设置为TRUE时,则该函数读取完指定列数后将转到下一行。这允许用户在最后一个字段后面添加注释。

(21)stringsAsFactors

逻辑值,标记处字符向量是否需要转化为因子,默认是TRUE。

(22)fileEncoding

字符串类型,指定文件的编码方式。如果指定了该参数,则文本数据按照指定的格式重新编码。

(23)encoding

假定输入字符串的编码方式。

(24)text

字符串类型。当未提供file参数时,则函数可以通过一个文本链接从text中读取数据。

(25)skipNul

逻辑值。是否忽略空值。默认为FALSE。

2.写文件

R 主要用于统计分析,可能读文件比写文件更加常用,但写文件也很重要。读文件用read.table(),写文件就用write.table()。

write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            eol = "\n", na = "NA", dec = ".", row.names = TRUE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

参数说明:

x: 要写入的对象,最好是矩阵或数据框。如果不是,它是试图强迫x到一个数据框。

file: 一个字符串命名文件或编写而打开的一个连接。" "表示输出到控制台。

append: 逻辑。只有当file是一个字符串才相关。

如果TRUE,输出追加到文件

如果FALSE,任何现有文件的名称被摧毁

quote: 一个逻辑值(TRUE或FALSE)或数字向量。如果TRUE,任何字符或因素列将用双引号包围。如果一个数值向量,其元素为引用的列的索引。在这两种情况下,行和列名报价,如果他们被写入。如果FALSE,并没有被引用。

sep: 字段分隔符字符串。每一行x中的值都被这个字符串分隔开。

row.names: 表示x的行名是否与x一起写的逻辑值,或者是写行名的字符向量

col.names: 类似上面。

二、 获取文件和目录信息

对于实现获取文件和目录信息,设置文件访问权限等功能,R有各种函数。以下是几个案例。

file.info():参数是表示文件名称的字符串向量,函数会给出每个文件的大小,创建时间,是否是目录等信息。

dir():返回一个字符串向量,列出在其第一个参数下面整个目录所有文件的名称。如果指定参数recursive = TRUE,结果将吧 第一个参数下面整个目录树显示出来。

file.exists():返回一个布尔值,表示作为参数的字符串向量中给定的每一个文件名是否存在。

三、函数相关

当然,R除了可以读入文件数据外,也提供了键盘和显示器的接口,比如可以用scan()和readline()函数通过键盘录入数据,可以通过print()函数将结果打印到显示器上,print()在之前的章节中都有用到。

1、scan()函数

scan(file = "", what = double(0), nmax = -1, n = -1, sep = "",
     quote = if(identical(sep, "\n")) "" else "'\"", dec = ".",
     skip = 0, nlines = 0, na.strings = "NA",
     flush = FALSE, fill = FALSE, strip.white = FALSE,
     quiet = FALSE, blank.lines.skip = TRUE, multi.line = TRUE,
     comment.char = "", allowEscapes = FALSE, encoding = "unknown")

主要的参数说明如下:

  1. what:声明读入为字符类型数据,可能指定读入的精度/类型,默认double()例如:what=integer(0);what=numeric(0);what=character(0);如果SCAN()读入有字符与数字,用what=""来进行声明,则会把读入的数字隐式的都转变成字符;

  2. sep:指定各个读入的数据之间的分隔符;默认情况下分隔符:空格、tab;如果不是其它分隔符,例如“:/”通过SEP来指定;

  3. 可以通过list指定读入变量的变量名,同时生成的对象为列表,则可以同时读入字符与数字;

  4. skip 从第几行开始读入数据;

  5. nlines 指定最大读入行数;

  6. 如果通过键盘输入的时候,不希望出现下标提示,则可以使用:quiet=TRUE;

  7. encoding =””指定的编码格式,有时候读入的中文可能会出现乱码的时候,可能通过这个参数来指定:Latin-1 或者 UTF-8;

  8. file = ""时为手动输入数据。也可以指定特定文件路径下的文本文件,比如:file= "F:/BioInfoLab/BioInfoCloud/gene.txt"

SCAN几点注意:

  1. 用于读入纯字符或者数字,没有表头;

  2. 如果输入的单一类型的变量,例如均是:数值或者均是字符,用scan效率更高。但其不能读入混合类型的数据,也就是在scan()读入的必须同为字符或者同为数值;

  3. 默认情况下用scan读入的数据生成向量类型(这也就是为什么读入的数据必须是同为字符或者同为数字)。

> num = scan(file = "",what = character(0))
1: 1
2: 2
3: 3
4: 
Read 3 items
> num
[1] "1" "2" "3"
> class(num)
[1] "character"

我们手动输入数字,结果发现类型是字符,因为我们指定what为character(0),如果我们输入的是数字,会将数字转化成字符。

> num1 = scan(file = "",what = numeric(0))
1: 1
2: 2
3: 3
4: 4
5: 
Read 4 items
> class(num1)
[1] "numeric"
> num1 = scan(file = "")
1: 12
2: 21
3: 
Read 2 items
> class(num1)
[1] "numeric"
> num1
[1] 12 21

请注意,命令行在行行首提示的是下一个输入项索引,键入一个空行表示结束输入,如果不希望报告已读取的项目数,可以设置参数quiet = TRUE。

2、readline()函数

如果想通过键盘输入单行数据,可以使用readline()函数。比如:

> aa = readline()
BioInfo_Cloud
> aa
[1] "BioInfo_Cloud"

但是该函数输入数字也当成字符串。

> bb = readline()
123434435
> bb
[1] "123434435"

3、print()和cat()函数

在交互模式下,只需要键入变量名或者表达式,就可以获取数据结果,但在函数体内部的变量就无法显示,这时候print()函数就排上用场了。

> x = 1:3
> x
[1] 1 2 3
> 1+3
[1] 4
> fun = function(){b = 3}
> fun
function(){b = 3}
> fun()
> 
> b
Error: object 'b' not found
> fun1= function(){
+     b = 3
+     print(b)}
> fun1
function(){
    b = 3
    print(b)}
> fun1()
[1] 3

上面的代码我们看到,函数fun中的b在交互模式下是显示不出来的,在fun1函数中通过print()函数,在调用fun1时,就可显示b的值了。

cat()函数也是用了打印数据在显示屏上的,比print()稍微好用一点。print()只能输出一个表达式,而且输出的内容带编号,可能会造成干扰。

> print("微信公众号:bioinfo_cloud")
[1] "微信公众号:bioinfo_cloud"
> cat("微信公众号:bioinfo_cloud\n")
微信公众号:bioinfo_cloud

这就是他们之间的差别。cat函数使用是,需要加\n,也就是换行转义符。要不然下次在使用cat时,会继续在同一行输出。

> cat(1:10)
1 2 3 4 5 6 7 8 9 10

cat默认以空格分割,如果不想用,可通过sep参数自定义设置。

> xx = c(2,1,34,12,24,34)
> cat(xx,sep=c(",",".","/","?","\n"))
2,1.34/12?24
34

转自:https://mp.weixin.qq.com/s?__biz=MzA4NDAzODkzMA==&mid=2651263754&idx=1&sn=2ee999a79c4ed413a63df22bc74f02c8&chksm=841ef777b3697e61824f2fbe053d5d2d427d8881f3e126155a8ac1bba92fff915e5387aadbd9&scene=21#wechat_redirect

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354