R语言基础入门(9)之因子类型

目录

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”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2万字带你攻略掉Selenium

目录 1. 准备工作 1.1 安装selenium库 1.2 安装浏览器驱动 2. 基本用法 2.1 初始化浏览器对象 2.2 访问页面 2.3 设置浏览器大小 2.4 刷新页面 2.5 前进后退 3. 获取页面基础属性 4. 定位页面元素 4.1 id定位 4.2 name定位 4.3 class定位 4.4 tag定位 4.5 lin…

IDEA里的web.xml页面的Servlet名称报错下方出现红色下划线

错误显示 对于上述错误是因为只有新建的Servlet名称但是并没为为这个Servlet指定访问地址的路径和映射&#xff0c;我们只需要添加访问地址的路径和映射就可以解决这个问题了。 修改之后的代码 <?xml version"1.0" encoding"UTF-8"?> <web-ap…

Python之Hello World

python实现Hello World项目 在项目上点击右键New–>File,然后输入文件名Hello World 一个Hello World文件创建完成 编写相应的代码 在空白的地方右击选择Run"Hello World" 程序运行成功&#xff0c;输出Hello World

knn(k近邻算法)——python

目录 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 导入相关库 4.2 读取数据 4.3 读取变量名 4.4 定义X,Y数据 4.5 分离训练集和测试集 4.6 计算欧式距离 4.7 可视化距离矩阵 4.8 预测样本 4.9 查看正确…

C语言中的文件是什么?

我们对文件的概念已经非常熟悉了&#xff0c;比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种&#xff0c;最主要的作用是保存数据。 在操作系统中&#xff0c;为了统一对各种硬件的操作&#xff0c;简化接口&#xff0c;不同的硬件设备也都被看成一个文件。对…

knn(k近邻算法)——matlab

目录 1. 基本定义 2. 算法原理 2.1 算法优缺点 2.2 算法参数 2.3 变种 3.算法中的距离公式 4.案例实现 4.1 读取数据 4.2 分离训练集和测试集 4.3 归一化处理 4.4 计算欧氏距离 4.5 排序和输出测试结果 4.6 计算准确率 总代码 1. 基本定义 k最近邻(k-Nearest N…

C语言打开文件详解

C语言中操作文件之前必须先打开文件&#xff1b;所谓“打开文件”&#xff0c;就是让程序和文件建立连接的过程。 打开文件之后&#xff0c;程序可以得到文件的相关信息&#xff0c;例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中&#xff0c;程序还可以记…

python turtle虎年来拜年了

1.画个虎 # codingutf-8 from turtle import * import timeCOLOR #B2814Ddef set_start(x, y, w, cCOLOR):penup()setx(x)sety(y)setheading(towards(0, 0))width(w)pencolor(c)pendown()speed(0)def left_rotate(time, angle, length):for i in range(time):left(angle)forwa…

TOPSIS法 —— matlab

目录 1.TOPSIS法介绍 2. 计算步骤 &#xff08;1&#xff09;数据标准化 &#xff08;2&#xff09;得到加权后的矩阵 &#xff08;3&#xff09;确定正理想解和负理想解 &#xff08;4&#xff09;计算各方案到正&#xff08;负&#xff09;理想解的距离 &#xff08;…

TOPSIS法 —— python

目录 1.TOPSIS法介绍 2. 计算步骤 &#xff08;1&#xff09;数据标准化 &#xff08;2&#xff09;得到加权后的矩阵 &#xff08;3&#xff09;确定正理想解和负理想解 &#xff08;4&#xff09;计算各方案到正&#xff08;负&#xff09;理想解的距离 &#xff08;…

C语言随机读写文件

实现随机读写的关键是要按要求移动位置指针&#xff0c;这称为文件的定位。 文件定位函数rewind和fseek 移动文件内部位置指针的函数主要有两个&#xff0c;即 rewind() 和 fseek()。 rewind() 用来将位置指针移动到文件开头&#xff0c;前面已经多次使用过&#xff0c;它的…

mysql-installer安装教程(详细图文)

目录 1.安装 2.配置系统环境变量 3.配置初始化my.ini文件 4.MySQL彻底删除 5.Navicat 安装 1.安装 先去官网下载需要的msi&#xff0c;在这放出官网下载地址下载地址 这里我具体以8.0.28 为安装例子&#xff0c;除了最新版安装界面有些变动以往的都是差不多的。 过去的版本…

Java三种随机数生成方法

java的三种随机数生成方式 随机数的产生在一些代码中很常用&#xff0c;也是我们必须要掌握的。而java中产生随机数的方法主要有三种&#xff1a;     第一种&#xff1a;new Random()     第二种&#xff1a;Math.random()     第三种&#xff1a;currentTimeMil…

Python MySQL入门连接

目录 基本环境准备 navicat的傻瓜使用方式 python连接 mysql安装教程&#xff1a;传送门 基本环境准备 WINR 输入cmd回车打开cmd&#xff0c;登录mysql: mysql -h localhost -u root -p然后输入密码回车即可。 创建用户名为testuser1&#xff1a; CREATE USER testuser1…

JDBC连接sql server数据库

IDEA使用JDBC连接Sqlserver数据库 在IDEA的项目中添加对应数据库的jar包 在项目中创建util包和DBUtil类用来存放数据库连接的java代码。 完整代码 package com.hnpi.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; …

Python MySQL创建表

目录 一、创建表 二、检查表是否存在 三、关键字 一、创建表 在库student环境下创建表名为stu: # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认用主机名port3306,user"root", #默认用户名password"123456"…

JDBC连接 Mysql数据库

IDEA使用JDBC连接Mysql数据库 在项目中添加连接Mysql数据库的jar包 在项目中创建util包和DBUtil类用来存放数据库连接的java代码。 完整代码 package com.zsh.util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import…

Python MySQL插入表

目录 1.插入表格 2.插入多行 3.获取插入的 ID 1.插入表格 要在 MySQL 中填充表&#xff0c;请使用“INSERT INTO”语句。 “stu”表中添加一条记录&#xff1a; 代码&#xff1a; # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhost", #默认…

Python MySQL选择

目录 1.从表中选择 2.选择列 3.使用 fetchone() 1.从表中选择 要从 MySQL 中的表中进行选择&#xff0c;请使用“SELECT”语句。从“stu”表中选择所有记录&#xff0c;并显示结果&#xff1a; # codinggbk #连接 import pymysqlmydb pymysql.connect(host"localhos…

Eclipse编辑器字体大小的设置

我们在第一次使用 Eclipse 编写程序时&#xff0c;由于 Eclipse 默认使用的是 Cosnolas 字体&#xff0c;字号为 10&#xff0c;所以编辑器中的字体非常小&#xff0c;不方便查看。 我们可以通过下面所示的方法来修改编辑器的字体大小。 操作方法&#xff1a; 1 . 选择“窗口…