R语言因子类型的实现

目录
  • 1.因子
  • 2.table()函数
  • 3.tapply()函数
  • 4.forcats包的因子函数

1.因子

R 中用因子代表数据中分类变量 , 如性别、省份、职业。有序因子代表有序量度,如打分结果,疾病严重程度等。

factor() 函数把字符型向量转换成因子,如

x <- c(" 男", " 女", " 男", " 男", " 女")
sex <- factor(x)
sex

返回:

attributes(sex)

返回:

因子有 class 属性,取值为"factor",还有一个 levels(水平值) 属性,此属性可以用 levels() 函数访问,如

levels(sex)

返回:

因子的 levels 属性可以看成是一个映射,把整数值 1,2, . . . 映射成这些水平值,因子在保存时会保存成整数值 1,2, . . . 等与水平值对应的编号。这样可以节省存储空间,在建模计算的程序中也比较有利于进行数学运算。

事实上,read.csv() 函数的默认操作会把输入文件的字符型列自动转换成因子,这对于性别、职业、地名这样的列是合适的,但是对于姓名、日期、详细地址这样的列则不合适。所以,在 read.csv() 调用中经常加选项 stringsAsFactors=FALSE 选项禁止这样的自动转换,还可以用 colClasses 选项逐个指定每列的类型。

as.numeric() 可以把因子转换为纯粹的整数值,如

as.numeric(sex)

返回:

因为因子实际保存为整数值,所以对因子进行一些字符型操作可能导致错误。用 as.character() 可以把因子转换成原来的字符型,如

as.character(sex)

返回:

为了对因子执行字符型操作(如取子串),保险的做法是先用 as.character() 函数强制转换为字符型。

factor() 函数的一般形式

factor(x, levels = sort(unique(x), na.last = TRUE),
    labels, exclude = NA, ordered = FALSE)

可以用选项 levels 自行指定各水平值 , 不指定时由 x 的不同值来求得。可以用选项 labels 指定各水平的标签 , 不指定时用各水平值的对应字符串。可以用 exclude 选项指定要转换为缺失值 (NA) 的元素值集合。如果指定了 levels, 则当自变量 x 的某个元素等于第 j 个水平值时输出的因子对应元素值取整数 j, 如果该 元素值没有出现在 levels 中则输出的因子对应元素值取NA。 ordered 取真值时表示因子水平是有次序的 (按编码次序)。

在使用 factor() 函数定义因子时,如果知道自变量元素的所有可能取值,应尽可能使用 levels= 参数指定这些不同可能取值,这样,即使某个取值没有出现,此变量代表的含义和频数信息也是完整的。自己指定 levels= 的另一好处是可以按正确的次序显示因子的分类统计值。

因为一个因子的 levels 属性是该因子独有的,所以合并两个因子有可能造成错误,但在最新版本4.1.2 没有报错,应跟版本有关,如

li1 <- factor(c(' 男', ' 女'))
li2 <- factor(c(' 男', ' 男'))
c(li1, li2)

返回:

如果结果不是因子的话,需要对其进行转换。则那样正确的做法

factor(c(as.character(li1), as.character(li2)))

就是先转换为字符型,再进行合并就可以了。

2.table() 函数

table() 函数统计因子各水平的出现次数(称为频数或频率)。也可以对一般的向量统计每个不同元素的出现次数。如

x <- c(" 男", " 女", " 男", " 男", " 女")
sex <- factor(x)
table(sex)

返回:

对一个变量用 table 函数计数的结果是一个特殊的有元素名的向量,元素名是自变量的不同取值,结果的元素值是对应的频数。单个因子或单个向量的频数结果可以用向量的下标访问方法取出单个频数或若干个频数的子集。

3.tapply() 函数

可以按照因子分组然后每组计算另一变量的概括统计。如

x <- c(" 男", " 女", " 男", " 男", " 女")
sex <- factor(x)
h <- c(165, 170, 168, 172, 159)
tapply(h, sex, mean)

返回:

4.forcats 包的因子函数

如果使用此函数,需要先进行载入:

library(forcats)

分类变量类数较多时,往往需要对因子水平另外排序、合并等,forcats 包提 供了一些针对因子的方便函数。

orcats::fac_reorder() 可以根据不同因子水平分成的组中另一数值型变 量的统计量值排序。如:

set.seed(1)
fac <- sample(c("red", "green", "blue"), 30, replace=TRUE)
fac <- factor(fac, levels=c("red", "green", "blue"))
x <- round(100*(10+rt(30,2)))
res1 <- tapply(x, fac, sd); res1

返回:

对上面数值画条形图

barplot(res1)

返回:

如果希望按照统计量次序对因子排序,可以用 forcats::fct_reorder() 函数,并画图条形图,如

fac2 <- fct_reorder(fac, x, sd)
res2 <- tapply(x, fac2, sd)
barplot(res2)

返回:

新的因子 fac2 的因子水平次序已经按照变量 x 的标准差从小到大排列

有时在因子水平数较多时仅想将特定的一个或几个水平次序放到因子水平最前面,可以用 forcats::fct_relevel() 函数,如:

levels(fac)

返回:

fac3 <- fct_relevel(fac, "blue"); levels(fac3)

返回:

fct_relevel() 第一个参数是要修改次序的因子,后续可以有多个字符型参数表示要提前的水平。

forcats::fct_reorder2(f, x, y)调整因子 f 的水平的次序,但是根据与每组中最大的 x 值相对应的 y 值大小调整次序,这样在作多个因子水平对应的曲线图时可以比较容易地区分多条曲线。

forcats::fct_recode() 可以修改每个水平的名称,如:

fac4 <- fct_recode(
fac,
" 红"="red", " 绿"="green", " 蓝"="blue")
table(fac4)

返回:

  fct_recode() 在修改水平名时允许多个旧水平对应到一个新水平,从而合并原来的水平。如果合并很多,可以用 fct_collapse() 函数,记得要先导入forcats 包的因子函数,如

compf <- fct_collapse(
comp,
" 其它"=c("", " 无名", " 无应答"),
" 联想"=c(" 联想", " 联想集团"),
" 百度"=c(" 百度", " 百度集团") )

如果某个因子频数少的水平很多,在统计时有过多水平不易展示主要的类别,可以用 forcats::fct_lump(f) 合并,缺省地从最少的类合并一直到 “ 其它 ” 类超过其它最小的类之前,可以用 n= 参数指定要保留多少个类

练习

设文件 class.csv 中包含如下内容 :
name,sex,age,height,weight
Alice,F,13,56.5,84
Becka,F,13,65.3,98
Gail,F,14,64.3,90
Karen,F,12,56.3,77
Kathy,F,12,59.8,84.5
Mary,F,15,66.5,112
Sandy,F,11,51.3,50.5
Sharon,F,15,62.5,112.5
Tammy,F,14,62.8,102.5
Alfred,M,14,69,112.5
Duke,M,14,63.5,102.5
Guido,M,15,67,133
James,M,12,57.3,83
Jeffrey,M,13,62.5,84
John,M,12,59,99.5
Philip,M,16,72,150
Robert,M,12,64.8,128
Thomas,M,11,57.5,85
William,M,15,66.5,112
用如下程序把该文件读入为 R 数据框 d.class, 其中的 sex 列已经自动转换为因
子。取出其中的 sex 和 age 列到变量 sex 和 age 中

d.class <- read.csv('class.csv', header=TRUE)
sex <- d.class[,'sex']
age <- d.class[,'age']

(1) 统计并显示列出 sex 的不同值频数;

(2) 分男女两组分别求年龄最大值;

(3) 把 sex 变量转换为一个新的因子, F 显示成 “Female” , M 显示成 “Male” 。

到此这篇关于R语言因子类型的实现的文章就介绍到这了,更多相关R语言因子类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • R语言中的因子类型详解

    一.Factor函数 #函数factor可以把一个向量编码为一个因子,其一般形式为: #factor(x,levels=sort(unique(x),na.last=TRUE),labels,exculde=NA,order=FALSE) #其中x是向量,levels是水平,可以自行指定各离散的取值,不指定时由x的不同值来表示,labels可以用来指定各水平的标签 #不指定时用各离散取值的对应字符串 sex<-c("M","F","M",&

  • R语言因子类型的实现

    目录 1.因子 2.table()函数 3.tapply()函数 4.forcats包的因子函数 1.因子 R 中用因子代表数据中分类变量 , 如性别.省份.职业.有序因子代表有序量度,如打分结果,疾病严重程度等. 用 factor() 函数把字符型向量转换成因子,如 x <- c(" 男", " 女", " 男", " 男", " 女") sex <- factor(x) sex 返回: at

  • R语言因子型数值转数值型的操作

    一直觉得只要是数字,不管是什么类型的,都可以通过as.numeric()函数转换为对应的numeric类型的数字,例如 x<-"123",x为character类型,而as.numeric(x)则为numeric类型的123. 但是因子(factor)类型却不一样. a<-factor(c(100,200,300,301,302,400,10)),它们的值分别为100 200 300 301 302 400 10,然而 as.numeric(a)对应的值并非100 200

  • R语言 Factor类型的变量使用说明

    factor类型的创建 1. factor( ) > credit_rating <- c("BB", "AAA", "AA", "CCC", "AA", "AAA", "B", "BB") #生成名为credit_rating的字符向量 > credit_factor <- factor(credit_rating) #

  • R语言-因子与向量的转换方式

    一.因子的特点或性质 1.因子可视为C或JAVA语言中的枚举,适用于有限状态的表示. 2.因子不可以赋枚举集合外的值,如一个因子包含male,female,则不能再赋male和female以为的值,赋其他值会将该元素设置为空值. 二.因子的建立 1.因子的建立 假定有因子gendor,为一组人的性别: > gendor<-factor(c('m','f','f','m'),labels=c('male','female')) 则通过上式建立一个性别因子. > gendor [1] fem

  • R语言中因子相关知识点详解

    因子是用于对数据进行分类并将其存储为级别的数据对象. 它们可以存储字符串和整数. 它们在具有有限数量的唯一值的列中很有用. 像"男性","女性"和True,False等.它们在统计建模的数据分析中很有用. 使用factor()函数通过将向量作为输入创建因子. 例 # Create a vector as input. data <- c("East","West","East","North

  • R语言-修改(替换)因子变量的元素操作

    因子变量的核心是水平,通过指定水平来修改. x<-c(1,1,1,1,2,2,2,3,3,3,3,4) xx<-factor(x);xx levels(xx) #得到水平为3的位置 level_3<-which(levels(xx)==3) #重新赋值 levels(xx)[level_3]<-03 xx #由于新值是03,0开头,所以把03当成3处理 levels(xx)[level_3]<-c("03") xx #字符串会自动转换成因子 levels(

  • R语言基本对象类型知识点详解

    基本向量 包含单类型对象(例如整数,浮点数,复数,文本,逻辑值或者原始型数据)的向量 复合对象 包含一些列基本向量的数据结构,例如列表,配对列表,``S4对象或者环境. 这些对象的特性各不相同,但它们都包含一系列命名的对象 特殊对象 在R编程中服务于特定目的的对象,例如any,NULL和...等. 这类对象在特定的环境中具有十分重要的意义,但是无法创建一个属于该类型的对象 R语言 R代码,其被执行后可以返回其他对象 函数 R的引擎; 其以参数作为输入,同时返回一些对象作为输出 有时候,函数会修改

  • R语言:实现因子与字符串的互转

    在导入大批量数据时,如果没有显式地指定"stringsAsFactors = FALSE",默认会将所有的字符串转换为因子,导致数据处理速度较慢. 示例数据如下: name,math,english,sex,year "yiifaa",65,68,"M",2018 "yiifee",95,98,"F",2018 "guagua",75,78,"M",2018 &quo

  • R语言学习初识Rcpp类型List

    目录 当我们想将 Rcpp 中的多种类型的对象通过一个 return 函数返回时,此时就需要将我们的所有对象整理成一个 Rcpp::List 型,然后再进行返回. 但相比于 R 中的 list(mat1 = mat1, mat2 = mat2) ,Rcpp 中的列表创建就相对复杂一些,需要使用 create() 函数,如下面例子所示: Rcpp::List ListFun(MatrixXd X) { Eigen::MatrixXd mat1, mat2; return List::create(

随机推荐