博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
R语言之read.table与write.table详解
阅读量:5804 次
发布时间:2019-06-18

本文共 5551 字,大约阅读时间需要 18 分钟。

hot3.png

数据的各种形式

    一般而言, 数据的每一行的不同元素可由tab键(txt文件), 逗号(csv文件), 空格等隔开.

    另外, 数据有行名和列名, 数据存储的时候可选择保存或者不保存.

    下面给出几种常见的数据的形式(txt文件的分隔符指定为tab键, csv文件的分隔符指定为逗号).数据的内容是一致的, 行名是("a1", "a2"), 列名是("A", "B", "C").

    a.txt:

A    B    Ca1    0.1    0.2    1a2    a    "a"    1

    b.txt:

A   B    C0.1 0.2    1a   "a"    1

    c.txt:

0.1 0.2    1a   "a"    1

    a.csv:

,A,B,Ca1,0.1,0.2,1a2,a,"a",1

     b.csv:

A,B,C0.1,0.2,1a,"a",1

     c.csv:

0.1,0.2,1a,"a",1

数据的输入

    read.table函数的声明如下:

read.table(file, header = FALSE, sep = "", quote = "\"'",           dec = ".", 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)

    下面仅从读入上述数据初步说明read.table函数参数的含义, 具体参数含义请自行查阅帮助文档.

a.txt <- read.table("a.txt", quote = "'")  # a.txt <- read.table("a.txt", header = TRUE, quote = "", row.names = 1)b.txt <- read.table("b.txt", header = TRUE, quote = "")c.txt <- read.table("c.txt", quote = "")a.csv <- read.table("a.csv", header = TRUE, sep = ",", quote = "",                     row.names = 1)b.csv <- read.table("b.csv", header = TRUE, sep = ",", quote = "")c.csv <- read.table("c.csv", sep = ",", quote = "")a.csv <- read.csv("a.csv", quote = "", row.names = 1)b.csv <- read.csv("b.csv", quote = "")c.csv <- read.csv("c.csv", header = FALSE, quote = "")

    其中read.csv函数是为处理csv文件而由read.table函数变形而来.

    由上述代码可以看出, 

    1. header是指定是否原文件是否包含列名, read.table默认值为FALSE, read.csv默认值为TRUE. 值得注意的是a.txt文件包含列名, 但是用read.table读取时使用了默认参数FALSE, 没有出错的原因在于: 在没指定header参数时, 如果第一行的元素比其他行的元素少一个, 自动将header参数设置为TRUE.

    2. sep是用来指定分隔符的. 默认值为"", 表示1个或多个空格, tab键, 新的一行, 回车键. read.csv默认值为",".

    3. quote用来指定包围字符型变量的符号, 读入后自动将其剔除. read.table默认值为"\"'", read.csv默认值为"\"", 故为了保留a与"a"的差别, 将quote设置为"". 

    4. row.names用于指定行名, 如果是数值k时, 则将第k列设为列名, 并将其从数据中移除. 值得注意的是a.txt文件包含行名, 但是用read.table默认不设置row.names参数, 没有出错的原因在于: 在没指定row.names参数时, 如果第一行的元素比其他行的元素少一个, 自动将row.names参数设置为1.        

输出数据

   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 = "")

    下面仅从输出上述数据得到与输入前一样的文件来说明write.table函数参数的含义, 具体参数含义请自行查阅帮助文档.

a.txt <- write.table(a.txt, "a.txt", quote = FALSE, sep = "\t")    b.txt <- write.table(b.txt, "b.txt", quote = FALSE, sep = "\t",                      row.names = FALSE)c.txt <- write.table(c.txt, "c.txt", quote = FALSE, sep = "\t",                      row.names = FALSE, col.names = FALSE)a.csv <- write.table(a.csv, "a.csv", quote = FALSE, sep = ",", col.names = NA)b.csv <- write.table(b.csv, "b.csv", quote = FALSE, sep = ",",                      row.names = FALSE)c.csv <- write.table(c.csv, "c.csv", quote = FALSE, sep = ",",                      row.names = FALSE, col.names = FALSE)a.csv <- write.csv(a.csv, "a.csv", quote = FALSE)b.csv <- write.csv(b.csv, "b.csv", quote = FALSE, row.names = FALSE)c.csv <- write.csv(c.csv, "c.csv", quote = FALSE, row.names = FALSE,                    col.names = FALSE)

    其中write.csv函数是为处理csv文件而由write.table函数变形而来.

    由上述代码可以看出, 

    1. quote用来指定是否为字符型变量添加双引号. 

    2. sep是用来指定分隔符的. write.table默认值为" ",write.csv默认值为","且不能更改.

    3. row.names指定是否输出行名. 

    4. col.names指定是否输出列名. write.table可设置为NA, 表示列名前空出一个位置, write.csv不能设置为NA, 如果设置为TRUE, 默认空出一个位置, 不可更改.

拓展阅读

    1. write.table数据的默认形式

    default.table

"A" "B" "C""a1" "0.1" "0.2" 1"a2" "a" "\"a\"" 1

    运行以下代码,default.table文件不改变   

input <- read.table("default.table")write.table(input, "default.table")

    2. write.csv不存在默认的数据形式

    3. R主要用于数据分析, 文本处理更适合交给perl, 使数据类型兼容perl

    default.table

    A    B    Ca1    0.1    0.2    1a2    a    "a"    1

    读取和输出代码如下:

default.table <- read.table("default.table", sep = "\t", quote = "")  # 通常情况下, 不需要特别指定quote, 数据里面有可能使用了空格等字符, 故应指定分隔符write.table(default.table, "default.table", quote = FALSE, sep = "\t",             col.names = NA)

    4. 使用append保存中间运行结果

    例如, 需要生成每行100个U[0, 1]分布随机数, 下面代码表示每生成100个随机数就保存一次.

colnames <- t(c("", paste("X", 1:100, sep = "")))write.table(colnames, "random.table", quote = FALSE, sep = "\t",             row.names = FALSE, col.names = FALSE)i <- 1while (1) {  write.table(t(c(i, runif(100))), append = TRUE, "random.table", quote = FALSE, sep = "\t",              row.names = FALSE, col.names = FALSE)  i <- i + 1}

    5. 长度不一的数据读取

    awful.table

    A    B    Ca1    0.1    0.2    1a2    a    "a"    1a3    3    3    3a4    4    4    4    4a5    5    5    5    5    5a6    6    6    6         6    6

    显然, 有些行的元素比列名的个数多, read.table应该不支持自动列名补全(如果有错, 麻烦指正), 故header设置为FALSE, 为了使每一行的元素个数一致, 设置fill为TRUE, 如果要设置空的单元格为NA, 可设置na.strings为"", 为了使sep分割的空字符成为一个单元, 可以设置strip.white为TRUE, 为了不使含有字符型元素的列成为factor, 可以设置stringsAsFactors为FALSE;

    值得注意的是, 这种情况下, 需要特别指定列名, 否则, R程序会自动根据前5行计算出列的个数, 故这里要设置col.names = paste("X", 1:7, sep = "").

awful.table <- read.table("awful.table", header = FALSE, sep = "\t", quote = "",                          col.names = paste("X", 1:7, sep = ""),                           na.strings = "", fill = TRUE, strip.white = TRUE,                          stringsAsFactors = FALSE)colnames(awful.table) <- ifelse(is.na(awful.table[1, ]),                                colnames(awful.table), awful.table[1, ])awful.table <- awful.table[-1, ]rownames(awful.table) <- awful.table[, 1]awful.table <- awful.table[, -1]

转载于:https://my.oschina.net/u/1791586/blog/282216

你可能感兴趣的文章
WebApi系列~目录
查看>>
限制CheckBoxList控件只能单选
查看>>
Java访问文件夹中文件的递归遍历代码Demo
查看>>
项目笔记:测试类的编写
查看>>
如何迅速分析出系统CPU的瓶颈在哪里?
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
如何用纯 CSS 为母亲节创作一颗像素画风格的爱心
查看>>
Linux基础命令---rmdir
查看>>
优秀程序员共有的7种优秀编程习惯
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
开发者论坛一周精粹(第五十五期) 全站HTTPS之OSS教程 一次可以备案几个网站?...
查看>>
(干货)Linux学习资源推荐
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>