第二章 创建数据集

在本章内容中,数据结构是非常重要的,对于后续的数据分析起着关键的作用,数据结构是可以用来存储数据的。


数据结构

2.1 数据集的概念

数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。
在下表中,病人编号是实例标识符(rownames-行号),入院时间是日期型变量,年龄是连续性变量,糖尿病类型是名义型变量,病情是有序型变量
R可以处理的数据类型包括数值型、字符型、逻辑型、复数型和原生型。其中前三个变量是数值型变量,后两个是字符型变量。

在R中,实例标识符成为rownames,将类别型(名义型和有序型)变量成为因子(factors)

数据集示例

2.2 数据结构

R拥有许多存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表。
数据结构

在R中,对象(object)是指可以赋值给变量的任何事物,包括常量、数据结构、函数甚至图形。数据框(data frame):可以存储不同类型的变量,这是最主要的数据结构。因子(factors):是名义型变量或有序型变量。

2.2.1 向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组。功能函数c()可以用来创建向量。

# 数值型向量a,R中在赋值时,<- 的两边一般需要有空格
 a <- c(2, 3, 4, 5, 6)
# 字符型向量b,且字符型向量中的元素需要用“”
b <- c("one", "two", "three")
# 逻辑型向量c,注意逻辑型是大写的,且不用“”
c <- c(TRUE, FALSE,TRUE) 

标量是只有一个元素的向量,用于保存常量;同一向量中,数据必须是相同类型的,不能混杂。

通过方括号来访问向量中的元素

a <- c(1, 2, 5, 3, 6, -2, 4)
# 表示取第三个元素,是5
a[3]
# 表示取1,3,5位置的元素,是1,5,6
a[c(1, 3, 5)]
# 表示取第2,3,4,5,6位置的元素
a[2:6]   

2.2.2 矩阵

是一个二维数组,每个元素都拥有相同的模式,可通过matrix()创建矩阵。矩阵元素的选择,可以使用下标和方括号来进行。X[i, j],用来选择矩阵X中的第i行和第j列的元素。

# 创建一个5行4列的矩阵,nrow指定行数,ncol指定列数
y <- matrix(1:20, nrow=5, ncol=4)
y
# cells向量,创建一个2x2的矩阵,rnames指定行名,cnames指定列名,byrow来确定按行创建还是按列创建矩阵,默认是按列填充。
cells    <- c(1,26,24,68)
rnames   <- c("R1", "R2")
cnames   <- c("C1", "C2") 
mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE)

矩阵和向量类似,只能包含一种数据结构,且都是二维的。

2.2.3 数组

数组与矩阵类似,但是维度可以大于2。可以用array()来创建数组。

dim1 <- c("A1", "A2")
dim2 <- c("B1", "B2", "B3")
dim3 <- c("C1", "C2", "C3", "C4")
# 1:24是矩阵数据,向量c(2,3,4)代表数组的维数向量--2行3列4个矩阵的组合,dimnames各维名称构成的向量或列表,缺省值维空
z <- array(1:24, c(2,3,4), dimnames=list(dim1, dim2, dim3))

2.2.4 数据框

数据框由于不同的列可以包含不同模式的数据,比矩阵更具有一般性。它将是在R中最常处理的数据结构。数据框可以通过data.frame()函数来创建。
patientdata <- data.frame(patientID, age, diabetes, status)

  • 数据框元素的选取:
    可以用下标记号,或直接指定列名。patientdata[1:2] 选取其中的第一和第二列的数据;或者patientdata[c("diabetes", "status")]选取这两列的数据。也可以使用$符号来表示某个变量,patientdata$age被用来选取变量age的元素。

为了方便使用变量,而不用每次都键入一次patientdata$,可以联合使用attach()和detach()。但是要注意的是:如果环境中在你attach数据框之前已经有一个相同的变量了,那么就会出现错误。
此外,with(data.frame, {code}),这个函数就不会出现上述的错误,因为花括号中的代码只是针对次数据框。然而,with()函数的局限在于,此函数内的赋值在全局环境中没法使用,只是在此函数中有作用。解决办法就是用特殊赋值符号<<- 代替标准赋值符号<-就可以全局使用。

2.2.5 因子

变量可以分为三类:名义型、有序型和连续性变量。

  • 名义型变量:是没有顺序之分的类别变量,糖尿病类型(type1,type2)就是名义型变量。
  • 有序型变量:表示一种顺序关系,而非数量关系,病情(poor,improved,excellent)就是一个很好的例子。
  • 连续型变量:可以呈现为某个范围内的任一值,并同时表示顺序和数量。年龄就是这样的例子。

因子:是名义型变量和有序型变量的统称,在R中,非常重要。它决定了数据的分析方式以及如何进行视觉呈现。
函数factor()以一个整数向量的形式存储类别值,同时一个由字符串(原始值)组成的内部向量映射到这些整数上。

原始的向量diabetes <- c("type1", type2", type1", type1"),通过diabetes <- factor(diabetes)将名义型向量存储为整数向量(1, 2, 1, 1),并在内部将其关联为1=type1和2=type2,并且会将关于此向量的任何分析都会作为名义型变量对待。
有序型向量,需要再指定参数ordered=TRUE:status <- c("poor", "improved", "excellent", "poor")通过语句status <- factor(status, ordered=TRUE)会将向量编码为(3,2,1,3),并同样在内部建立关联1=excellent、2=improved和3=poor。字符型向量的因子水平是默认通过字母顺序建立,因此一般我们都通过levels参数来指定需要的顺序。

  • 因子的使用
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
diabetes <- factor(diabetes)
status <- factor(status, order=TRUE)
patientdata <- data.frame(patientID, age, diabetes, status)
# str()函数可以查看数据集的结构,包括多少个变量和多少个观测值
str(patientdata)   
# 显示描述性的统计信息                            
summary(patientdata)

str()和summary()结果的说明:
str()提供R中某个对象的信息,图中显示这个对象是data.frame:4个变量,每个变量有4个观测值。还列出了各个变量的类型,有数值型变量,因子(名义型变量)和有序因子(有序型变量)以及水平。
summary()提供数据的统计信息,会区别对待各个变量。显示了连续型变量的最大值、最小值、均值和各四分位数,并显示类别型变量的频数值。

str()和summary()结果

2.2.6 列表

列表(list)是R的数据类型中最为复杂的一种。list()用来创建列表,列表中可以是目前为止的所有结构。下面的列表有4个对象:一个字符串,一个数值型向量,一个矩阵以及一个字符型向量。
列表元素的访问:可以通过双重方括号[[2]]中指明代表某个对象的数字或名称来访问。也可以用$来取得某个对象。

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

2.3 数据的输入

R的数据源

2.3.1 使用键盘输入数据

最常见的方式有两种:用R内置的文本编辑器和直接在代码中嵌入数据,一般首先考虑文本编辑器。edit()函数会自动调用一个手动输入数据的文本编辑器。

  1. 创建空数据框:mydata <- data.frame(age=numeric(0), gender=character(0), weight=numeric(0))
  2. 调用编辑器:mydata <- edit(mydata)或者fix(mydata),键入你的数据,关闭编辑器,自动保存。
  • 直接在代码中嵌入
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()从带分隔符的文本文件中导入数据,并可读入一个表格格式的文件,将其保存为一个数据框。语法:
mydata <- read.table(file, options)
file是一个带分隔符的ASCII文本文件,options是控制如何处理数据的选项。如下:

header:文件的第一行是否包含了变量名的逻辑型变量。
seq:用来指定读取某种分隔符的文件,如seq=“,”来读取用逗号来分割的行内数据的文件。
row.names:用于一个或多个的行标识符。
col.names:如果不包括列变量名,可以用此选项来指定。
colClasses:用来指定每一列的数据类型。
stringAsFactors:一个逻辑变量,是够要将字符转化成为因子,默认是转化为因子。

2.3.2 导入Excel数据

读取一个Excel文件的最好方式,就是在Excel中将其导出为一个逗号分隔文件csv,并使用read.table()将其导入到R中。也可以安装xlsx包,直接导入Excel工作表。
其他还有很多导入数据的方式,如从网页抓取数据、SPSS导入数据、导入数据和数据库系统导入数据等等。

推荐阅读更多精彩内容