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