R 语言实战 (2nd ed)(24):创建数据集 2.3.2

阅读数:25 2019 年 11 月 13 日 15:44

R语言实战(2nd ed)(24):创建数据集 2.3.2

内容简介
本书注重实用性,是一本全面而细致的 R 指南,高度概括了该软件和它的强大功能,展示了使用的统计示例,且对于难以用传统方法处理的凌乱、不完整和非正态的数据给出了优雅的处理方法。作者不仅仅探讨统计分析,还阐述了大量探索和展示数据的图形功能。新版做了大量更新和修正,新增了近 200 页内容,介绍数据挖掘、预测性分析和编程。
本书适合数据分析人员及 R 用户学习参考。

(从带分隔符的文本文件导入数据)

你可以使用read.table()从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格的每一行分别出现在文件中每一行。其语法如下:

复制代码
mydataframe <- read.table(file, options)

其中,file是一个带分隔符的 ASCII 文本文件,options是控制如何处理数据的选项。表 2-2 列出了常见的选项。

表 2-2 函数read.table()的选项

选项 描述
header 一个表示文件是否在第一行包含了变量名的逻辑型变量
sep 分开数据值的分隔符。默认是sep="",这表示了一个或多个空格、制表符、换行或回车。使用sep=","来读取用逗号来分隔行内数据的文件,使用sep="\t"来读取使用制表符来分割行内数据的文件
row.names 一个用于指定一个或多个行标记符的可选参数
col.names 如果数据文件的第一行不包括变量名(header=FASLE),你可以用col.names去指定一个包含变量名的字符向量。如果header=FALSE以及col.names选项被省略了,变量会被分别命名为V1V2,以此类推
na.strings 可选的用于表示缺失值的字符向量。比如说,na.strings=c("-9", "?")-9?值在读取数据的时候转换成NA
colClasses 可选的分配到每一列的类向量。比如说,colClasses=c("numeric", "numeric", "character", "NULL", "numeric")把前两列读取为数值型变量,把第三列读取为字符型向量,跳过第四列,把第五列读取为数值型向量。如果数据有多余五列,colClasses的值会被循环。当你在读取大型文本文件的时候,加上colClasses选项可以可观地提升处理的速度
quote 用于对有特殊字符的字符串划定界限的自负床。默认值是双引号(")或单引号('
skip 读取数据前跳过的行的数目。这个选项在跳过头注释的时候比较有用
stringsAsFactors 一个逻辑变量,标记处字符向量是否需要转化成因子。默认值是TRUE,除非它被colClases所覆盖。当你在处理大型文本文件的时候,设置成stringsAsFactors=FALSE可以提升处理速度
text 一个指定文字进行处理的字符串。如果text被设置了,file应该被留空。2.3.1 节给出了一个例子

考虑一个名为 studentgrades.csv 的文本文件,它包含了学生在数学、科学、和社会学习的分数。文件中每一行表示一个学生,第一行包含了变量名,用逗号分隔。每一个单独的行都包含了学生的信息,它们也是用逗号进行分隔的。文件的前几行如下:

复制代码
StudentID,First,Last,Math,Science,Social Studies
011,Bob,Smith,90,80,67
012,Jane,Weary,75,,80
010,Dan,"Thornton, III",65,75,70
040,Mary,"O'Leary",90,95,92

这个文件可以用以下语句来读入成一个数据框:

复制代码
grades <- read.table("studentgrades.csv", header=TRUE,
    row.names="StudentID", sep=",")

结果如下:

> grades

   First             Last Math Science Social.Studies
11   Bob            Smith   90      80             67
12  Jane            Weary   75      NA             80
10   Dan    Thornton, III   65      75             70
40  Mary          O'Leary   90      95             92

> str(grades)
'data.frame':   4 obs. of  5 variables:
 $ First         : Factor w/ 4 levels "Bob","Dan","Jane",..: 1 3 2 4
 $ Last          : Factor w/ 4 levels "O'Leary","Smith",..: 2 4 3 1
 $ Math          : int  90 75 65 90
 $ Science       : int  80 NA 75 95
 $ Social.Studies: int  67 80 70 92

如何导入数据有很多有趣的要点。变量名Social Studies被自动地根据 R 的习惯所重命名。列StudentID现在是行名,不再有标签,也失去了前置的 0。Jane 的缺失的科学课成绩被正确地识别为缺失值。我不得不在 Dan 的姓周围用引号包围住,从而能够避免 Thornton 和 III 之间的空格。否则,R 会在那一行读出七个值而不是六个值。我也在 O’Leary 左右用引号包围住了,负载 R 会把单引号读取为分隔符(而这不是我想要的)。最后,姓和名都被转化成为因子。

默认地,read.table()把字符变量转化为因子,这并不一定都是我们想要的情况。比如说,很少情况下,我们才会把回答者的评论转化成为因子。你可用多种方法去掉这个行为。加上选项stringsAsFactors=FALSE对所有的字符变量都去掉这个行为。此外,你可以用colClasses选项去对每一列都指定一个类(比如说,逻辑型、数值型、字符型或因子型)。

用以下代码导入同一个函数:

grades <- read.table("studentgrades.csv", header=TRUE,
    row.names="StudentID", sep=",",
    colClasses=c("character", "character", "character",
                 "numeric", "numeric", "numeric"))

得到以下数据框:

> grades

    First             Last Math Science Social.Studies
011   Bob            Smith   90      80             67
012  Jane            Weary   75      NA             80
010   Dan    Thornton, III   65      75             70
040  Mary          O'Leary   90      95             92

> str(grades)

'data.frame':   4 obs. of  5 variables:
 $ First         : chr  "Bob" "Jane" "Dan" "Mary"
 $ Last          : chr  "Smith" "Weary" "Thornton, III" "O'Leary"
 $ Math          : num  90 75 65 90
 $ Science       : num  80 NA 75 95
 $ Social.Studies: num  67 80 70 92

注意,行名保留了前缀 0,而且 First 和 Last 不再是因子。此外,grades 作为实数而不是整数来进行排序。

函数read.table()还拥有许多微调数据导入方式的追加选项。更多详情,请参阅help(read.table)

用连接来导入数据
本章中的许多示例都是从用户计算机上已经存在的文件中导入数据。R 也提供了若干种通过连接(connection)来访问数据的机制。例如,函数file()gzfile()bzfile()xzfile()unz()url()可作为文件名参数使用。函数file()允许你访问文件、剪贴板和 C 级别的标准输入。函数gzfile()bzfile()xzfile()unz()允许你读取压缩文件。
函数url()能够让你通过一个含有 http://、 ftp:// 或 file :// 的完整 URL 访问网络上的文件,还可以为 HTTP 和 FTP 连接指定代理。为了方便,(用双引号围住的)完整的 URL 也经常直接用来代替文件名使用。更多详情,参见help(file)

评论

发布