R语言数据结构之数据框
1. 数据框
由于不同列可以包含不同模式(数值型、字符型等)的数据,数据框的概念交矩阵更为一般。当数据有多种模式,无法将数据集放入到一个矩阵,使用数据框是最佳选择。
数据框可以通过函数data.frame()创建:
mydata <- data.frame(col1, col2, col3, ...)
其中的列向量可以为col1,col2,col3,...任何类型。每一列的名称可以由函数names指定。
> patientID <- c(1,2,3,4) > age <- c(25, 26, 27, 28) > diabetes <- c("type1", "type2", "type3", "type4") > 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 26 type2 improved 3 3 27 type3 excellent 4 4 28 type4 poor
每一列数据的模式必须唯一,但可以将多个模式的不同列放到一起组成数据框。下面演示如何读取数据框中的元素:
> patientdata[1:2] patientID age 1 1 25 2 2 26 3 3 27 4 4 28 > patientdata[c("diabetes", "status")] diabetes status 1 type1 poor 2 type2 improved 3 type3 excellent 4 type4 poor > patientdata$age [1] 25 26 27 28
其中记号$是用来选取一个给定数据框中的某个特征变量。例如,你想生成病人糖尿病类型diabetes和病变情况status的列联表,可用如下代码:
> table(patientdata$diabetes, patientdata$status) excellent improved poor type1 0 0 1 type2 0 1 0 type3 1 0 0 type4 0 0 1
在每个变量名前输入一次patientdata$会令人生厌,可以联合使用函数attach()和detach()或单独使用with()来简化代码。
- 函数attach()可以将数据框添加到R的搜索路径中。R在遇到一个变量名以后,将检查搜索路径中的数据框,以定位到这个变量。
- 函数detach()可以讲数据框从搜索路径中移除。
- 函数with()可以针对with()函数内的数据框进行执行。
例子:
> plot(patientdata$patientID,patientdata$age)
也可以写成
> attach(patientdata)
> plot(patientID, age)
当名称相同的对象不止一个时,使用attach()函数的局限性就体现出来了:
> age <- c(1,2,4,5) > attach(patientdata) > plot(patientID, age)
在数据框patientdata绑定之前已经有一个名为age的对象,这种情况下,原始对象将获取优先权,结果将于预想的有所出入。在这种情况下,可以使用with()重写上例:
> with(patientdata, { + summary(age, diabetes) + plot(patientID, age) + plot(patientID, status) + })
这种情况下,大括号{}之间的语句都针对patientdata执行,这样就无需担心名称冲突了。
with()函数的局限性在于赋值尽在此函数的括号内生效,考虑如下情况:
> with(patientdata, { + stats <- summary(age) + stats + }) Min. 1st Qu. Median Mean 3rd Qu. Max. 25.00 25.75 26.50 26.50 27.25 28.00 > stats 错误: 找不到对象'stats'
如果需要创建在with()结构以存在的对象,使用特殊赋值符号<<-代替标准赋值符号。它可以将对象保存到with()之外的全局环境中。
> with(patientdata, { + stats <<- summary(age) + stats + }) Min. 1st Qu. Median Mean 3rd Qu. Max. 25.00 25.75 26.50 26.50 27.25 28.00 > stats Min. 1st Qu. Median Mean 3rd Qu. Max. 25.00 25.75 26.50 26.50 27.25 28.00
相对于attach()个多书推荐使用with()。但这其实是个人偏好问题。
实例标识符
在病例数据中,病人编号(patientID)用于区分数据集中的不同个体。在R中,实例标识符(case identifier)可以通过row.names选项指定:
> patientdata <- data.frame(patientID, age, diabetes, status,
+ row.names=patientID)
将patientID指定为R中标记各类输出和图形中实例名称所用的变量。
2014-2-11 22:02:03