R 语言实战 (2nd ed)(20):创建数据集 2.2.5

阅读数:18 2019 年 11 月 13 日 15:44

R语言实战(2nd ed)(20):创建数据集 2.2.5

内容简介
本书注重实用性,是一本全面而细致的 R 指南,高度概括了该软件和它的强大功能,展示了使用的统计示例,且对于难以用传统方法处理的凌乱、不完整和非正态的数据给出了优雅的处理方法。作者不仅仅探讨统计分析,还阐述了大量探索和展示数据的图形功能。新版做了大量更新和修正,新增了近 200 页内容,介绍数据挖掘、预测性分析和编程。
本书适合数据分析人员及 R 用户学习参考。

(因子)

如你所见,变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量。糖尿病类型DiabetesType1Type2)是名义型变量的一例。即使在数据中Type1编码为 1 而Type2编码为 2,这也并不意味着二者是有序的。有序型变量表示一种顺序关系,而非数量关系。病情Statuspoorimprovedexcellent)是顺序型变量的一个上佳示例。我们明白,病情为 poor(较差)病人的状态不如 improved(病情好转)的病人,但并不知道相差多少。连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。年龄Age就是一个连续型变量,它能够表示像 14.5 或 22.8 这样的值以及其间的其他任意值。很清楚,15 岁的人比 14 岁的人年长一岁。

类别(名义型)变量和有序类别(有序型)变量在 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进行的任何分析都会将其作为名义型变量对待,并自动选择适合这一测量尺度1的统计方法。

1 这里的测量尺度是指定类尺度、定序尺度、定距尺度、定比尺度中的定类尺度。——译者注

要表示有序型变量,需要为函数factor()指定参数ordered=TRUE。给定向量:

复制代码
status <- c("Poor", "Improved", "Excellent", "Poor")

语句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。请保证指定的水平与数据中的真实值相匹配,因为任何在数据中出现而未在参数中列举的数据都将被设为缺失值。

数值型变量可以用levelslabels参数来编码成因子。如果男性被编码成 1,女性被编码成 2,则以下语句:

复制代码
sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))

把变量转换成一个无序因子。注意到标签的顺序必须和水平相一致。在这个例子中,性别将被当成类别型变量,标签“Male”和“Female”将替代 1 和 2 在结果中输出,而且所有不是 1 或 2 的性别变量将被设为缺失值。

代码清单 2-6 演示了普通因子和有序因子的不同是如何影响数据分析的。

代码清单 2-6 因子的使用

> 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(patientdata)                                         <----❷显示对象的结构
‘data.frame’:   4 obs. of  4 variables:
 $ patientID: num  1 2 3 4
 $ age      : num  25 34 28 52
 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
 $ status   : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
> summary(patientdata)                                      <------❸显示对象的统计概要
   patientID         age         diabetes       status
 Min.   :1.00   Min.   :25.00   Type1:3   Excellent:1
 1st Qu.:1.75   1st Qu.:27.25   Type2:1   Improved :1
 Median :2.50   Median :31.00             Poor     :2
 Mean   :2.50   Mean   :34.75
 3rd Qu.:3.25   3rd Qu.:38.50
 Max.   :4.00   Max.   :52.00

首先,以向量的形式输入数据❶。然后,将diabetesstatus分别指定为一个普通因子和一个有序型因子。最后,将数据合并为一个数据框。函数str(object)可提供 R 中某个对象(本例中为数据框)的信息❷。它清楚地显示diabetes是一个因子,而status是一个有序型因子,以及此数据框在内部是如何进行编码的。注意,函数summary()会区别对待各个变量❸。它显示了连续型变量age的最小值、最大值、均值和各四分位数,并显示了类别型变量diabetesstatus(各水平)的频数值。

评论

发布