一、数据集
数据集的概念
数据集是由数据组成的矩阵数组,<font color=#ea4335 红色 size=3>行表示观测(observation),列表示变量(variable)
数据类型
- 数值型变量
PatientID、AdmData、Age 为数值型变量 - 字符型变量
Diabetes、Status则为字符型变量 - 逻辑型变量
- 复数型变量
- 原生型(字节)
另外,PatientID 是实例标识符,AdmData 含有日期数据。
Diabetes 和 Status 则为字符型变量,并且分别为名义型和有序型变量
R 将实例标识符称为rownames,将类别型(包括名义型与有序型)变量称为因子
二、数据结构
1. 向量
向量是用于储存数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()
可用来创建向量
a<-c(1,2,3,4,5,6,7)
注意,单个向量中数据必须是一样的数据类型;标量是只有一个元素的向量,例如 f<- 3、g<-"US"
<font color=#ea4335 红色 size=3>通过在方括号中给定元素所处位置的数值,可以访问向量中的元素,即方括号内是元素的索引
2. 矩阵
矩阵是一个二维数组,即能储存两个维度的向量,其中每个元素的坐标是有两个的。但需要注意的是,其中每个元素都拥有相同的模式,一般通过函数matrix()
来创建矩阵。一般的格式为:
mymatrix <- matrix(vector, nrow= number_of_rows, ncol= number_of_columns,
+ byrow = logical_value,
+ dinames= list(char_vector_rownames, char_vector_colnames))
其中,vector 即为包含了矩阵中元素的向量,nrow & ncol 是指定了行数和列数,一个房子的建成,除了框架搭好,砖头砌上的方式也有讲究,byrow 则告诉 R 是以行的顺序添加元素,还是以列的顺序添加。dinames 则告诉了每行每列的名称。
可以使用下标和中括号来选择矩阵中的行、列或元素。
X[i,]
指定了矩阵 X 中的第 i 行等等。
3. 数组
数组(array)类似于矩阵,但是它的维度可以大于 2。数组可以依如下格式创建:
myarray <- array(vector, dimensions, dinames)
dimensions 指定了每个维度下标的最大值
从数组中选取元素的方式也是依靠中括号
4. 数据框
数据框的限制相对较小,每一列的数据模式均可不同,可通过data.frame()
创建
mydata<- data.frame(col1, col2, col3)
注意,这里的col1, col2, col3 会直接被当做列名,若要修改列名可用函数
names()
来修改,如:
names(mydata)[1] <-"k"
这样就可以将第一列的列名修改为“k”了
选取数据框中的特定元素
通过美元符号$ 来选取一个数据框内的特点变量如mydata$a
没个变量名前都要输入数据框的名称可能会有些繁琐,但也清楚的表示了是哪个数据集中的变量点明了归属。如果想省去这一步,可以利用下列几个函数
attach(),detach(), with()
实例标识符(case identifier)
可以在 data.frame()中,rowname 中指定哪个列为实例
5. 因子
变量有以下几种类型
- 名义型
如"type1"等等 - 有序型
如“first”等等,内在有先后顺序的关系 - 连续型
年龄 “Age”
而类别(名义型)变量和有序变量在 R 中称为因子
函数factor()
存储类别值以一个整数向量的形式,整数的取值范围是[1...k](注意 k 是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。
举一个例子
diabetes <- c("type1", "type2", "type1","type1")
语句diabetes <- factor(diabetes)
将向量储存为(1, 2, 1, 1),并在内部将其关联为 1 = type1, 2= type2 等。(根据字母顺序而定)。 并且在后续分析中,会将其作为名义型变量对待
而有序型变量的表示仅需在 factor()
函数中,指定参数ordered = TRUE
即可
但是由于因子的水平,即序列的先后顺序是依据字母的先后顺序,所以默认的排序可能不是我们想要的。这时候我们可以使用参数levels
选项来覆盖默认排序
status <- factor(status, ordered = TRUE, levels = c("Poor","Improved","Excellent"))
这时候,levels 的参数相当于直接将向量 c 投影在向量c(1,2,3)
上,各水平的赋值为,1 = Poor, 2 = Improved, 3 = Excellent。需要注意的是,保证 levels 中指定的水平需要与数据中的真实值相匹配,若在数据中出现了参数中未出现的数据都将设为缺失值
如果,在数据中,例如男性女性性别这一列,数据被以 1、2 编码,则可以利用以下语句将变量转换为一个无序因子
sex <- factor(sex, levels = c(1,2), labels = c("Male", "Female"))
这个例子中,参数 levels 的作用是给标签定位的,各水平相当于按顺序赋值给 Male 和 Female
6. 列表
列表是最复杂的一种数据结构,某个列表可以是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用list()
函数创建列表:
mylist <- list(name1 = object1, name2 = object2)
访问列表的方式与以上几种不太一样,在这里通过双重方括号中指明代表某个成分的数字或名称来访问列表中的元素
mylist <- list(title = g, ages = h, j, k)
#以下两种访问方式输出结果一致
mylist[[2]]
mylist[["ages"]]
三、数据的输入
最为简单的一种可视化输入方法即用fix()
函数,直接用键盘来输入数据
当然比较常用的一个输入数据的函数是read.table()
里面涉及到比较多的参数,下面一一列举并说明
1. header
表示文件的第一行时候包含了变量名的逻辑型变量
2. sep
分开数据值的分隔符,默认是 sep="" 表示了一个或多个空格、制表符、换行、或回车,当然也有 sep=" ",使用制表符来分割行内数据
3. row.names
用于指定一个或多个行标记符,将其作为实例标识符,以区分行内数据是不同的个体
4. col.names
如果第一行不包含变量,可以用它指定一个包含变量名的字符向量,即给每一列添加变量名,如果它们都被省略的,R 自动给他们命名 V1、V2...
5. na.strings
用于表示缺失值的字符向量,特点将某些值转换成 NA
6. colClasses
可选的,将每一列的变量分配为特定的类别,比如 colClasses = c("numeric", "numeric", "character"), 如果数据多于三列,则 colClasses 的值会循环
7. quote
对有特殊字符的字符串划定界限的字符串
8. skip
需要跳过的行的数目
9. stringsAsFactors
标记处字符向量是否转化为因子,默认为 TRUE,可以被 colClasses 覆盖,处理大型数据时,将之设置为 FALSE 可以提升速度
10. text
指定文字设置处理的字符串
四、数据集的标注
对于变量,我们希望能有个更详细的标注去描述它。一种解决办法是,将变量标签作为变量名,然后通过位置下标来访问
names(patientdata)[2] <- "Age at hospitalization(in years)"
patientdata[2]
值标签
factor()
函数可以为类别型变量创建值标签
levels 为变量的实际值,而 labels 表示包含了理想值标签的字符型变量