文档介绍:实验目的
实验内容
学习S语言中离散变量、混合数据的表示方法
1、数据表示方法
2、应用实例
3、实验作业
因子、列表、数据框
因子(factor)和有序因子
统计中的变量重要类别:
区间变量和名义变量、有序变量。
区间变量取连续的数值,可以进行求和、平均等运算。
名义变量和有序变量取离散值,既可用数值代表也可用字符型值,其具体数值没有数量意义,不能用于加减乘除计算而只能用来分类或者计数。名义变量比如性别、省份、职业,有序变量比如班级名次、质量等级。
因为离散变量有各种不同表示方法,在S中为统一起见使用因子(factor)来表示这种分类变量。还提供了有序因子(ordered factor)来表示有序变量。
因子是一种特殊的字符型向量,其中每一个元素取一组离散值中的一个,而因子对象有一个特殊属性levels表示这组离散值(用字符串表示)。例如:
> x <- c("男", "女", "男", "男", "女")
> y <- factor(x)
> y
[1] 男女男男女
Levels: 男女
函数factor()用来把一个向量编码成为一个因子。
一般形式为:
factor(x, levels = sort(unique(x), = TRUE), labels, exclude = NA, ordered = FALSE)
可以自行指定各离散取值水平(levels),不指定时由x的不同值来求得。
labels可以用来指定各水平的标签,不指定时用各离散取值的对应字符串。
exclude参数用来指定要转换为缺失值(NA)的元素值集合。如果指定了levels,则因子的第i个元素当它等于水平中第j个时元素值取“j”,如果它的值没有出现在levels中则对应因子元素值取NA。
ordered取真值时表示因子水平是有次序的(按编码次序)。
()检验对象是否因子,()把一个向量转换成一个因子。
> x=c(1,0,1,1,0)
>y=factor(x,levels=sort(unique(x),decreasing=T),labels=c("男", "女"),exclude=NA,order=F)
> y
[1] 男女男男女
Levels: 男女
> x=c(1,0,1,1,,0,2)
y=factor(x,levels=c(1,0),
labels=c("男", "女"),exclude=NA,order=F)
> y
[1] 男女男男女<NA>
Levels: 男女
因子的基本统计是频数统计,用函数table()来计数。例如,
> sex = factor(c("男", "女", "男", "男", "女"))
> <- table(sex)
>
男女
3 2
表示男性3人,女性2人。table()的结果是一个带元素名的向量,元素名为因子水平,元素值为该水平的出现频数。
S的结果除了可以显示外,本身都是S对象(如这里的向量结果),可以很方便地进一步处理。
可以用两个或多个因子进行交叉分类。比如,性别(sex)和职业(job)交叉分组可以用table(sex, job)来统计每一交叉类的频数,结果为一个矩阵,矩阵带有行名和列名,分别为两个因子的各水平名。
因子可以用来作为另外的同长度变量的分类变量。比如,假设上面的sex是5个学生的性别,而
> h <- c(165, 170, 168, 172, 159) 是这5个学生的身高,则
> tapply(h, sex, mean)
可以求按性别分类的身高平均值。
这样用一个等长的因子向量对一个数值向量分组的办法叫做不规则数组(ragged array)。后面我们还可以看到更多的因子的应用。
列表(list)定义
列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型。元素本身允许是其它复杂数据类型,比如,列表的一个元素也允许是列表。
列表元素用“列表名[[下标]]”的格式引用。
但是,列表不同于向量,我们每次只能引用一个元素,如rec[[1:2]]的用法是不允许的。
注意:“列表名[下标]”或“列表名[下标范围]”的用法也是合法的,但其意义与用两重括号的记法完全不同,两重记号取出列表的一个元素,结果与该元素类型相同,如果使用一重括号,则结果是列表的一个子列表(结果类型仍为列表)。
> rec = list(name="李明", age=30, scores=c(85, 76, 90))
> rec
$name
[1] "李明"
$age
[1] 30
$scores