r语⾔各形状编号_R语⾔⼊门第⼋讲:编码分类变量(factor)今天第⼋篇~~~~~~
在第⼀讲中我给⼤家介绍了read.table函数的使⽤。最近我在处理⼀个⼀百万左右的数据,发现read.table函数出了问题。我不知道是在excel转成txt时出的问题还是因为R在读取数据时出了问题------应该不是操作的问题,可能因为数据过于庞⼤(⾄少在参考书中⽬前应该没有⼀百万的例⼦介绍),在转换的过程中我读不出来数据。它会提⽰我某某⾏数据不全。即使是我⽤了参数fill=T,也不管⽤,因为它会提⽰我⾏名称重复。我并不知道为什么会这样------我确信我的数据在excel表中是完整的,可是就是读不出来。(当然还有⼀种可能就是我的计算机不够⾼级,所以在转换的时候出错了------因为在运⾏的时候还是会卡,退出R都会等半天------师兄们说是我的电脑不⾏了)另外⼀个数据⼤概18万个样本量,也出现类似错误,或者少读取那么⼀两⾏,或者读取的⾮常混乱。于是我在想,实践就是和理论⼀样啊!还是要多实践才能进步。
好了,前⾯做了这么多铺垫,⽬的就是想告诉⼤家read.table在读取excel表格转化的制表分隔符⽂件时出错了。介绍⼀个更好⽤⽽且⾄少⽬前我成功读出数据的函数read.csv。
它的使⽤和read.table⼀模⼀样,参数也⼀模⼀样。不同的⼀点就是参数的默认值。read.table中你需要设置header=T来确定变量名,设置fill=T来使⾏有空缺的数据读⼊R中,但是在read.csv中,⾃动设置了这些项⽬,以及sep=”,”,因为excel本来就是逗号分隔。在读取之前,你需要做的就是先把excel表格转
化为csv的格式:在另存为的⽂件类型中到CSV(逗号分隔)(*.csv)这⼀选项保存就可以了。之后写代码就OK:
> setwd("E:/Rstore/")
> wq=read.csv("wq.csv")
> wq
A  B  C  D
1 1
2 65 78 98
2 56 89 87 78
3 78 87 56 98
4 98 89 24 56
5 78 87 87 12
6 96 89 33 45
7 23 78 69 65
8 23 98 82 86
9 65 87 12 45
可以看到,什么都没有设置,wq⽂件就被读出来了,很⽅便。read.table的所有参数都可以在这⾥使⽤。
上⼀讲我给⼤家介绍了参数stringsAsFactors。留了⼀个⼩⼩的疑问,就是什么是“factor”。在R中,它表⽰因⼦。说成因⼦可能⼤家不是很明⽩。实际上我⾃⼰也并不名明⽩。但是重要的仍然是运⽤。因⼦在R中起到的是分类变量的作⽤。这⾥稍微介绍⼏个名词。我们在统计分析中,通常都是选整体的⼀⼩部分观察单位作为数据进⾏分析,⽽不是那个“整体”。这个整体我们称为总体,⽽选择的其中某些⽤来分析的这⼀⼩部分观察单位称作样本。样本包含的数量⼤⼩称作样本含量。 每个样本的某个属性特征是不相同的,这种不同被称作变异,正因为有了变异的存在,所以我们将观察单位的某种反映变异的特征称为变量。举个例⼦:某个省的全体男性是⼀个总体,那么我们选择该省⼀部分男性做调查,这⼀部分男性就是样本。选择的这⼀部分男性的数量就是样本含量。我们想了解这些男性的平均⾝⾼和体重,那么⾝⾼和体重就是变量,其测量值的⼤⼩称为变量值。
变量的分类有很多种⽅法,这⾥⾯我只说其中的⼀种就⾜够了:定量变量与定性变量。定量变量简单说来就是可以⽤实数表⽰的变量,⽐如我们说的⾝⾼,体重,能够确切的说出⼀个实数来代表它------如某个男性的⾝⾼为183cm,体重为70kg,是很明确的。定性变量⼜被称作分类变量,即对该变量只能下⼀个定义,但是⼀般不能⽤确切的数值表⽰,⽐如性别(男,⼥),民族(回,汉),吸烟(是,否)。当然,我们在实际处理数据的时候会把它们变成某个数值(如1,2),但是这仅仅是为了适应统计软件,实际上它们还是分类变量。介于定量变量与定性变量之间的是等级变量(有序变量),所以也可以称为半定量变量,⽐如⾼⾎压,有1级,2级,3级,这些本质上是分类变量,但是它们有先后顺序(等级)差别,所以处理的时候就是另外的⽅法。
好了,下⾯我们介绍函数factor:
> ID=1:5
> sex=c(1,2,2,1,1)
> age=c(12,50,30,44,62)
> disease=c("malaria","hypertension","diabetes","hypertension","diabetes")
> degree=c("mild","severe","moderate","severe","moderate")
> patient=data.frame(ID,sex,age,disease,degree)
> patient
ID sex age      disease  degree
1  1  1  1
2      malaria    mild
2  2  2  50 hypertension  severe
3  3  2  30    diabetes moderate
4  4  1  44 hypertension  severe
5  5  1  62    diabetes moderate
我随意编写了⼏个数据,第⼀⾏代码⽣成了5位病⼈的ID,第⼆⾏是性别(1为男、2为⼥),第三⾏年龄,第四⾏为疾病(疟疾、⾼⾎压、糖尿病),第四⾏⽣成疾病的严重程度(轻度、重度、中等)。
在这⾥,年龄是⼀个定量变量,ID是编号,实际上并没有什么分析意义。剩下的性别、疾病以及疾病的程度都属于分类变量,在R中它们被称作因⼦。虽然我们是以字符输⼊的,但是默认的stringsAsFactors函数会帮我们进⾏转化。要想了解该数据框的变量都是什么类型的,我们需要⼀个函数str():
> str(patient)
'data.frame':  5 obs. of  5 variables:
$ ID    : int  1 2 3 4 5
$ sex    : num  1 2 2 1 1
$ age    : num  12 50 30 44 62
$ disease: Factor w/ 3 levels "diabetes","hypertension",..: 3 2 1 2 1
$ degree : Factor w/ 3 levels "mild","moderate",..: 1 3 2 3 2
结果的第⼀⾏告诉我们该对象是⼀个数据框,有5个变量,其后⽤$连结的就是每⼀个变量的类型。结
果的最后两⾏disease和degree即被判定为因⼦,也就是分类变量,disease有三个⽔平,degree有三个⽔平。因⼦⽔平可以理解为分类变量的⽔平,或者说分类变量的类别。这⾥⾯性别给的是数值型变量,因为在录⼊的时候我们指定1是“男”,2是“⼥”,这是为了在录⼊数据时候⽅便⽽设置的。我们如果想将它重新赋值变为因⼦,就需要使⽤factor函数:
> patient$sex2=factor( patient$sex,levels=c(1,2),labels=c("M","F"))
> patient
ID sex age      disease  degree sex2钱枫竟然都已经结婚了
1  1  1  1
2      malaria    mild    M
2  2  2  50 hypertension  severe    F
3  3  2  30    diabetes moderate    F
4  4  1  44 hypertension  severe    Mpay watch
5  5  1  62    diabetes moderate    M
这⾏代码中,等号左边是对数据框patient添加⼀新的⼦集“Sex2”,上⼀讲已经说明了,等号后⾯是factor的使⽤,即将⼀个向量变换为⼀个因⼦。我们将sex转变为因⼦,参数levels设定因⼦的⽔平,参数labels设定因⼦⽔平的标签为“M”(male)和“F”(female)。
接下来我们再看看这个数据框的结构:
> str(patient)
最红的网络歌曲'data.frame':  5 obs. of  6 variables:
$ ID    : int  1 2 3 4 5
$ sex    : num  1 2 2 1 1
$ age    : num  12 50 30 44 62
$ disease: Factor w/ 3 levels "diabetes","hypertension",..: 3 2 1 2 1
$ degree : Factor w/ 3 levels "mild","moderate",..: 1 3 2 3 2
$ sex2  : Factor w/ 2 levels "M","F": 1 2 2 1 1
结果的最后⼀⾏告诉我们因⼦sex2有两个⽔平,分别是M和F。
分类变量有等级(顺序)差别时,我们称作等级变量(有序变量)。⽐如对疾病严重程度的分级:
> degree=c("mild","severe","moderate","severe","moderate")
> factor(degree)
[1] mild    severe  moderate severe  moderate
Levels: mild moderate severe
这⾥显⽰疾病程度有三个⽔平,轻度(mild)、中度(moderate)、和重度(severe),既然知道这是⼀个有等级差别的因⼦,我们在分析过程中肯定也要将它分等级,这时候我们会⽤到⼀个参数ordered=T,即排序:
> degree=c("mild","severe","moderate","severe","moderate")
> factor(degree,ordered=T)
[1] mild    severe  moderate severe  moderate
Levels: mild < moderate < severe
结果中看到levels这⼀⾏有变化,R对严重程度进⾏排序并告诉我们轻度物流管理课程
> degree=c("slight","ailing","moderate","ailing","moderate")
> factor(degree,ordered=T)
[1] slight  ailing  moderate ailing  moderate
Levels: ailing < moderate < slight
这种排序完全与我们的想法背离:重度(ailing)
> factor(degree,ordered=T,levels=c("slight","moderate","ailing"))
[1] slight  ailing  moderate ailing  moderate
Levels: slight < moderate < ailing
这样就和我们认为的相同了。
函数factor有⼀个默认参数exclude=NA,即排除含有NA的元素,意思就是缺失值NA不算作⼀个因⼦的⽔平。例如:
> degree=c("slight","ailing","moderate","ailing","moderate",NA)
> factor(degree)
[1] slight  ailing  moderate ailing  moderate
Levels: ailing moderate slight
结果中NA没有被算作⼀个⽔平。
> degree=c("slight","ailing","moderate","ailing","moderate",NA)arctan
寇占文> factor(degree,exclude=NULL)
[1] slight  ailing  moderate ailing  moderate
Levels: ailing moderate slight
令参数exclude等于空值(NULL)的话,则NA也被算作因⼦的⼀个⽔平。
当然,如果你想排除任意⼀个⽔平,只需把exclude的赋值更改即可:
> degree=c("slight","ailing","moderate","ailing","moderate")
> factor(degree,exclude="slight")
[1]    ailing  moderate ailing  moderate
Levels: ailing moderate
这⾏代码是将slight排除掉。原先的元素slight换成了缺失值,同时因⼦的⽔平也不存在slight。
str()函数可以窥探任何数据的结构,⽤法也很简单。虽然⾥⾯还有很多参数,但是应该不妨碍我们直接对它的使⽤。我也在继续研究该函数,如果有结果会和⼤家分享。
factor()函数⽬前本⼈仅了解到该⽔平,并且我认为还是够⽤的。
对于任何函数,⽤法都是多样的,如果有新的发现我会即时分享给⼤家。
最后,关于read.table函数在读取⼤数据时候为什么会出现失误,如果⼤家知道原因,或者有更好的办法,可以和我讨论。
本次就到这⾥~~~~
(图⽚来源于⽹络)