2.1 数据集的概念
数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。表2-1提供了一个假想的病例数据集。
不同的行业对于数据集的行和列叫法不同。统计学家称它们为观(observation)和变量(variable),数据库分析师则称其为记录(record)和字段(field),数据挖掘和机器学习学科的研究者则把它们叫作示例(example)和属性(attribute)。我们在本书中通篇使用术语观测和变量。
你可以清楚地看到此数据集的结构(本例中是一个矩形数组)以及其中包含的内容和数据类型。在表2-1所示的数据集中,PatientID是行/实例标识符,AdmDate是日期型变量,Age是连续型变量,Diabetes是名义型变量,Status是有序型变量。
R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。表2-1实际上对应着R中的一个数据框。多样化的数据结构赋予了R极其灵活的数据处理能力。
R可以处理的数据类型(模式)包括数值型、字符型、逻辑型(TRUE/FALSE)、复数型(虚数)和原生型(字节)。在R中,PatientID、AdmDate和Age为数值型变量,而Diabetes和Status则为字符型变量。另外,你需要分别告诉R:PatientID是实例标识符,AdmDate含有日期数据,
Diabetes和Status分别是名义型和有序型变量。R将实例标识符称为rownames(行名),将类别型(包括名义型和有序型)变量称为因子(factors)。我们会在下一节中讲解这些内容,并在第3章中介绍日期型数据的处理。
2.2 数据结构
R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。
它们在存储数据的类型、创建方式、结构复杂度,以及用于定位和访问其中个别元素的标记等方面均有所不同。图2-1给出了这些数据结构的一个示意图。
2.2.1 向量
向量用于储存数值型、字符串或者逻辑型数据的一维数组。执行组合功能的函数**c()**可用来创建向量。各类向量如下所示:
rm(list=ls())
a = c(1,2,3,4)
b = c("one","two","three")
c= c(TRUE,TRUE,TRUE,FALSE,TRUE)
这里,a是数值型向量,b是字符型向量,而c是逻辑型向量。注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。
注意 标量是只含一个元素的向量,例如f <- 3、g <- "US"和h <- TRUE。它们用于保存常量。
通过在方括号中给定元素所处位置的数值,我们可以访问向量中的元素。例如,**a[c(2, 4)]**用于访问向量a中的第二个和第四个元素。更多示例如下:
a <- c("k", "j", "h", "a", "c", "m")
a[3]
[1] "h"
a[c(1, 3, 5)]
[1] "k" "h" "c"
a[2:6]
[1] "j" "h" "a" "c" "m"
最后一个语句中使用的冒号用于生成一个数值序列。例如,a <- c(2:6)等价于a <- c(2, 3, 4, 5, 6)
2.2.2 矩阵
2.2.2.1矩阵定义:
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数**matrix()**创建矩阵。一般使用格式为:
2.2.2.2 创建格式:
myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns,
byrow=logical_value, dimnames=list(
char_vector_rownames, char_vector_colnames))
**vector:**矩阵的元素
**nrow:**指定矩阵的行数
**ncol:**指定矩阵的列数
**dimnames:**包含了可选的、以字符型向量表示的行名和列名
**byrow:**表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认情况下按列填充
案例1:
代码:
y <- matrix(1:20, nrow=5, ncol=4)
y
结果:
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
案例2:
代码:
cells <- c(1,26,24,68)
rnames <- c("R1", "R2")
cnames <- c("C1", "C2")
mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, # 按行填充
dimnames=list(rnames, cnames))
mymatrix
结果:
C1 C2
R1 1 26
R2 24 68
案例3:
代码:
mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=FALSE, #按列填充
dimnames=list(rnames, cnames))
mymatrix
结果:
C1 C2
R1 1 24
R2 26 68
2.2.2.3 矩阵元素的提取:
我们可以使用下标和方括号来选择矩阵中的行、列或元素。X[i,]指矩阵X中的第i行,X[,j]指第j列,X[i, j]指第i行第j 个元素。选择多行或多列时,下标i和j可为数值型向量,如代码所示:
案例1:
创建矩阵:
x <- matrix(1:10, nrow=2)
x
提取第二行:
代码:
x[2,]
结果:
[1] 2 4 6 8 10
提取第二列:
代码:
x[,2]
结果:
[1] 3 4
提取第1行,第4列位置的元素:
代码:
x[1,4]
结果:
[1] 7
提取第1行,第4、5列位置的元素
代码:
x[1, c(4,5)]
结果:
[1] 7 9
2.2.3 数组
2.2.3.1 数组定义:
数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建
2.2.3.2 数组创建格式:
myarray <- array(vector, dimensions, dimnames)
**vector:**数组中的数据
**dimensions:**是一个数值型向量,给出了各个维度下标的最大
值
**dimnames:**是可选的、各维度名称标签的列表
2.2.3.3 创建数组案例:
代码:
dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
z <- array(1:24, c(2, 3, 4), dimnames=list(dim1, dim2, dim3))
结果:
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
如你所见,数组是矩阵的一个自然推广。它们在编写新的统计方法时可能很有用。像矩阵一样,数组中的数据也只能拥有一种模式。从数组中选取元素的方式与矩阵相同。上例中,元素z[1,2,3]为15。
2.2.4 数据框
2.2.4.1 数据框定义:
由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更为一般。它与你通常在SAS、SPSS和Stata中看到的数据集类似。数据框将是你在R中最常处理的数据结构。
表2-1所示的病例数据集包含了数值型和字符型数据。由于数据有多种模式,无法将此数据集放入一个矩阵。在这种情况下,使用数据框是最佳选择。
数据框可通过函数*data.frame()*创建:
2.2.4.2 数据框创建格式:
mydata <- data.frame(col1, col2, col3,...)
其中的列向量col1、col2、col3等可为任何类型(如字符型、数值型或逻辑型)。每一列的名称可由函数names指定。代码清单2-4清晰地展示了相应用法。
2.2.4.3 数据框案例:
代码:
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
patientdata
结果:
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
每一列数据的模式必须唯一,不过你却可以将多个模式的不同列放到一起组成数据框。由于数据框与分析人员通常设想的数据集的形态较为接近,我们在讨论数据框时将交替使用术语列和变量。
2.2.4.4 数据框数据读取:
选取数据框中元素的方式有若干种。你可以使用前述(如矩阵中的)下标记号,亦可直接指定列名。
案例1:
代码:
patientdata[1:2] # 读取第1、2列
结果:
patientID age
1 1 25
2 2 34
3 3 28
4 4 52
案例2:
代码:
patientdata[c("diabetes", "status")] # 读取diabetes、status列
结果:
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor
案例3:
代码:
patientdata$age # 读取age列
结果:
[1] 25 34 28 52
第三个例子中的记号$是新出现的➊。它被用来选取一个给定数据框中的某个特定变量。例如,如果你想生成糖尿病类型变量diabetes和病情变量status的列联表
案例4:
代码:
table(patientdata$diabetes, patientdata$status)
结果:
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0
在每个变量名前都键入一次patientdata$可能会让人生厌,所以不妨走一些捷径。可以联合使用函数attach()和detach()或单独使用函数with()来简化代码。
1. attach()、detach()和with()
函数attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名以后,将检查搜索路径中的数据框。以第1章中的mtcars数据框为例,可以使用以下代码获取每加仑行驶英里数(mpg)变量的描述性统计量,并分别绘制此变量与发动机排量(disp)和车身重量(wt)的散点图:
代码:
summary(mtcars$mpg)
结果:
Min. 1st Qu. Median Mean 3rd Qu.
10.40 15.43 19.20 20.09 22.80
Max.
33.90
代码:
plot(mtcars$mpg, mtcars$disp)
结果:
代码:
plot(mtcars$mpg, mtcars$wt)
结果:
以上代码也可写成:
代码:
attach(mtcars)
summary(mpg)
plot(mpg, disp)
plot(mpg, wt)
detach(mtcars)
结果:
同上
函数detach()将数据框从搜索路径中移除。值得注意的是,detach()并不会对数据框本身做任何处理。这句是可以省略的,但其实它应当被例行地放入代码中,因为这是一个好的编程习惯。(接下来的几章中,为了保持代码片段的简约和简短,我可能会不时地忽略这条良训。)
当名称相同的对象不止一个时,这种方法的局限性就很明显了。考虑以下代码:
这里,在数据框mtcars被绑定(attach)之前,你们的环境中已经有了一个名为mpg的对象。在这种情况下,原始对象将取得优先权,这与你们想要的结果有所出入。由于mpg中有3个元素而disp中有32个元素,故plot语句出错。函数attach()和detach()最好在你分析一个单独的数据框,并且不太可能有多个同名对象时使用。任何情况下,都要当心那些告知某个对象已被屏蔽(masked)的警告。
除此之外,另一种方式是使用函数with()。可以这样重写上例:
代码:
with(mtcars, {
print(summary(mpg))
plot(mpg, disp)
plot(mpg, wt)
})
在这种情况下,花括号{}之间的语句都针对数据框mtcars执行,这样就无需担心名称冲突了。如果仅有一条语句(例如summary(mpg)),那么花括号{}可以省略。
2. 实例标识符
在病例数据中,病人编号(patientID)用于区分数据集中不同的个体。在R中,实例标识符(case identifier)可通过数据框操作函数中的rowname选项指定。例如,语句:
代码:
patientdata <- data.frame(patientID, age, diabetes,
status, row.names=patientID)
patientdata
结果:
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
将patientID指定为R中标记各类打印输出和图形中实例名称所用的变量。
2.2.5 因子
如你所见,变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量。糖尿病类型Diabetes(Type1、Type2)是名义型变量的一例。即使在数据中Type1编码为1而Type2编码为2,这也并不意味着二者是有序的。有序型变量表示一种顺序关系,而非数量关系。病情Status(poor、improved、excellent)是顺序型变量的一个上佳示例。我们明白,病情为poor(较差)病人的状态不如improved(病情好转)的病人,但并不知道相差多少。
连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。年龄Age就是一个连续型变量,它能够表示像14.5或22.8这样的值以及其间的其他任意值。很清楚,15岁的人比14岁的人年长一岁。
2.2.5.1 因子定义:
类别(名义型)变量和有序类别(有序型)变量在R中称为因子**(factor)**。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。
函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
举例来说,假设有向量:
diabetes <- c("Type1", "Type2", "Type1", "Type1")
语句diabetes <- factor(diabetes)将此向量存储为(1, 2, 1, 1),并在内部将其关联为1=Type1和2=Type2(具体赋值根据字母顺序而定)。针对向量diabetes进行的任何分析都会将其作为名义型变量对待,并自动选择适合这一测量尺度①的统计方法。
2.2.5.2 因子创建格式:
要表示有序型变量,需要为函数factor()指定参数ordered=TRUE。给定向量:
status <- c("Poor", "Improved", "Excellent", "Poor")
status <- factor(status, ordered=TRUE)
语句status <- factor(status, ordered=TRUE)会将向量编码为(3, 2, 1, 3),并在内部将这些值关联为1=Excellent、2=Improved以及3=Poor。另外,针对此向量进行的任何分析都会将其作为有序型变量对待,并自动选择合适的统计方法。
对于字符型向量,因子的水平默认依字母顺序创建。这对于因子status是有意义的,因为“Excellent”“Improved”“Poor”的排序方式恰好与逻辑顺序相一致。如果“Poor”被编码为“Ailing”,会有问题,因为顺序将为“Ailing”“Excellent”“Improved”。如果理想中的顺序是“Poor” “Improved”“Excellent”,则会出现类似的问题。按默认的字母顺序排序的因子很少能够让人满意。
你可以通过指定levels选项来覆盖默认排序。例如:
status <- factor(status, order=TRUE,
levels=c("Poor", "Improved", "Excellent"))
各水平的赋值将为1=Poor、2=Improved、3=Excellent。请保证指定的水平与数据中的真实值相匹配,因为任何在数据中出现而未在参数中列举的数据都将被设为缺失值。
数值型变量可以用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2,则以下语句:
sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))
2.2.5.3 因子案例:
下列演示了普通因子和有序因子的不同是如何影响数据分析的。
案例1:
首先,以向量的形式输入数据➊。然后,将diabetes和status分别指定为一个普通因子和一个有序型因子。最后,将数据合并为一个数据框。函数str(object)可提供R中某个对象(本例中为数据框)的信息➋。它清楚地显示diabetes是一个因子,而status是一个有序型因子,以及此数据框在内部是如何进行编码的。注意,函数summary()会区别对待各个变量➌。它显示了连续型变量age的最小值、最大值、均值和各四分位数,并显示了类别型变量diabetes和status(各水平)的频数值。
2.2.6 列表
2.2.6.1 列表定义:
列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分,component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。
2.2.6.2 列表创建方式:
mylist <- list(object1, object2, ...)
其中的对象可以是目前为止讲到的任何结构。你还可以为列表中的对象命名:
mylist <- list(name1=object1, name2=object2, ...)
2.2.6.3 列表创建案例:
代码:
g <- "My First List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow=5)
k <- c("one", "two", "three")
mylist <- list(title=g, ages=h, j, k)
mylist # 输出整个列表
结果:
$title
[1] "My First List"
$ages
[1] 25 26 18 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"
代码:
mylist[[2]] # 输出第二个成分
结果:
[1] 25 26 18 39
代码:
mylist[["ages"]]
结果:
[1] 25 26 18 39
本例创建了一个列表,其中有四个成分:一个字符串、一个数值型向量、一个矩阵以及一个字符型向量。可以组合任意多的对象,并将它们保存为一个列表。
你也可以通过在双重方括号中指明代表某个成分的数字或名称来访问列表中的元素。此例中,mylist[[2]]和mylist[[“ages”]]均指那个含有四个元素的向量。对于命名成分,mylist$ages也可以正常运行。由于两个原因,列表成为了R中的重要数据结构。首先,列表允许以一种简单的方式组织和重新调用不相干的信息。其次,许多R函数的运行结果都是以列表的形式返回的。需要取出其中哪些成分由分析人员决定。你将在后续各章发现许多返回列表的函数示例。
2.3 数据的输入
2.3.1 使用键盘输入数据
代码:
mydatatxt <- "
age gender weight
25 m 166
30 f 115
18 f 120
"
mydata <- read.table(header=TRUE, text=mydatatxt)
2.3.2 从带分隔符的文本文件导入数据
你可以使用**read.table()**从带分隔符的文本文件中导入数据。此函数可读入一个表格格式的文件并将其保存为一个数据框。表格的每一行分别出现在文件中每一行。其语法如下:
mydataframe <- read.table(file, options)
**file:**是一个带分隔符的ASCII文本文件
**options:**是控制如何处理数据的选项。
考虑一个名为studentgrades.csv的文本文件,它包含了学生在数学、科学、和社会学习的分数。文件中每一行表示一个学生,第一行包含了变量名,用逗号分隔。每一个单独的行都包含了学生的信息,它们也是用逗号进行分隔的。文件的前几行如下:
这个文件可以用以下语句来读入成一个数据框:
代码:
grades <- read.table("studentgrades.csv", header=TRUE,
row.names="StudentID", sep=",")
结果:
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
2.3.3 导入 Excel 数据
xlsx包可以用来对Excel 97/2000/XP/2003/2007文件进行读取、写入和格式转换。函数read.xlsx()导入一个工作表到一个数据框中。最简单的格式是read.xlsx(file, n)
,其中file是Excel工作簿的所在路径,n则为要导入的工作表序号。举例说明,在Windows上,以下代码:
library(xlsx)
workbook <- "c:/myworkbook.xlsx"
mydataframe <- read.xlsx(workbook, 1)
从位于C盘根目录的工作簿myworkbook.xlsx中导入了第一个工作表,并将其保存为一个数据框mydataframe。
函 数**read.xlsx()**有些选项可以允许你指定工作表中特定的行(rowIndex)和列(colIndex),配合上对应每一列的类(colClasses)。*对于大型的工作簿(比如说,100 000+个单元格),你也可以使用*read.xlsx2()函数。这个函数用Java来运行更加多的处理过程,因此能够获得可观的质量提升。请查阅help(read.xlsx)获得更多细节。
2.3.4 导入 XML 数据
以XML格式编码的数据正在逐渐增多。R中有若干用于处理XML文件的包。例如,由Duncan Temple Lang编写的XML包允许你读取、写入和操作XML文件。XML格式本身已经超出了本书的范围。对使用R存取XML文档感兴趣的读者可以参阅www.omegahat.org/RSXML,从中可以找到若干份优秀的软件包文档。
2.3.5 从网页抓取数据
2.3.6 导入 SPSS 数据
IBM SPSS数据集可以通过foreign包中的函数**read.spss()导入到R中,也可以使用Hmisc包中的spss.get()**函数。函数spss.get()是对read.spss()的一个封装,它可以为你自动设置后者的许多参数,让整个转换过程更加简单一致,最后得到数据分析人员所期望的结果。
首先,下载并安装Hmisc包(foreign包已被默认安装):
install.packages("Hmisc")
然后使用以下代码导入数据:
library(Hmisc)
mydataframe <- spss.get("mydata.sav", use.value.labels=TRUE)
这段代码中,mydata.sav是要导入的SPSS数据文件,use.value.labels=TRUE表示让函数将带有值标签的变量导入为R中水平对应相同的因子,mydataframe是导入后的R数据框。
2.3.7 导入 SAS 数据
R中设计了若干用来导入SAS数据集的函数,包括foreign包中的**read.ssd()**,Hmisc包中的**sas.get()**,以及sas7bdat包中的 **read.sas7bdat()**。如果你安装了SAS,sas.get()是一个好的选择。
比如说,你想导入一个名为clients.sas7bdat的SAS数据集文件,它位于一台Windows机器上的C:/mydata文件夹中,以下代码导入了数据,并且保存为一个R数据框:
library(Hmisc)
datadir <- "C:/mydata"
sasexe <- "C:/Program Files/SASHome/SASFoundation/9.4/sas.exe"
mydata <- sas.get(libraryName=datadir, member="clients", sasprog=sasexe)
**libraryName是一个包含了SAS数据集的文件夹,member是数据集名字(去除掉后缀名sas7bdat),sasprog是到SAS可运行程序的完整路径。有很多可用的选项;查看help(sas.get)获得更多细节。**
2.3.8 导入 Stata 数据
要将Stata数据导入R中非常简单直接。所需代码类似于:
library(foreign)
mydataframe <- read.dta("mydata.dta")
这里,mydata.dta是Stata数据集,mydataframe是返回的R数据框。
2.3.9 导入 NetCDF 数据
Unidata项目主导的开源软件库NetCDF(Network Common Data Form,网络通用数据格式)定义了一种机器无关的数据格式,可用于创建和分发面向数组的科学数据。NetCDF格式通常用来存储地球物理数据。ncdf包和ncdf4包为NetCDF文件提供了高层的R接口。
ncdf包为通过Unidata的NetCDF库(版本3或更早)创建的数据文件提供了支持,而且在Windows、Mac OS X和Linux上均可使用。ncdf4包支持NetCDF 4或更早的版本,但在Windows上尚不可用。
2.3.10 导入 HDF5 数据
HDF5(Hierarchical Data Format,分层数据格式)是一套用于管理超大型和结构极端复杂数据集的软件技术方案。rhdf5包为R提供了一个HDF5的接口。这个包在Bioconductor网站上而不是CRAN上提供。你可以用以下代码对之进行安装:
source("http://bioconductor.org/biocLite.R")
biocLite("rhdf5")
像XML一样,HDF5格式超出了本书的内容范围。如果想学习更多相关知识,可访问HDF Group 网站( http://www.hdf5group.org/ )。 由 Bernd Fischer 编写的 http://www.bioconductor.org/packages/release/bioc/vignettes/rhdf5/inst/doc/rhdf5.pdf是一个rhdf5包的优秀指南。
2.3.11 访问数据库管理系统
- ODBC接口
- DBI相关包
2.4 数据集的标注
为了使结果更易解读,数据分析人员通常会对数据集进行标注。这种标注包括为变量名添加描述性的标签,以及为类别型变量中的编码添加值标签。例如,对于变量age,你可能想附加一个描述更详细的标签“Age at hospitalization (in years)”(入院年龄)。对于编码为1或2的性别变量gender,你可能想将其关联到标签“male”和“female”上。
2.4.1 变量标签
遗憾的是,R处理变量标签的能力有限。一种解决方法是将变量标签作为变量名,然后通过位置下标来访问这个变量。考虑之前病例数据框的例子。名为age的第二列包含着个体首次入院时的年龄。代码:
names(patientdata)[2] <- “Age at hospitalization (in years)”
将age重命名为"Age at hospitalization (in years)“。很明显,新的变量名太长,不适合重复输入。作为替代,你可以使用patientdata[2]来引用这个变量,而在本应输出age的地方输出字符串"Age at hospitalization (in years)”。很显然,这个方法并不理想,如果你能尝试想出更好的命名(例如,admissionAge)可能会更好一点。
2.4.2 值标签
函数factor()可为类别型变量创建值标签。继续上例,假设你有一个名为gender的变量,
其中1表示男性,2表示女性。你可以使用代码:
patientdata$gender <- factor(patientdata$gender,
levels = c(1,2),
labels = c("male", "female"))
这里levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。
2.5 处理数据对象的实用函数
我们来简要总结一下实用的数据对象处理函数:
我们已经讨论过其中的大部分函数。函数**head()和tail()**对于快速浏览大数据集的结构非常有用。例如,head(patientdata)将列出数据框的前六行,而*tail(patientdata)将列出最后六行。*我们将在下一章中介绍length()、cbind()和rbind()等函数。我们将其汇总于此,仅作参考。