R语言将变量分组的3种方法实例(含cut函数说明)

目录
  • 前言
  • 方法一:直接对分组变量进行赋值
  • 方法二:使用within函数对变量进行分组
  • 方法三:采用cut函数
  • 总结

前言

在数据处理的过程中,我们有时候需要将连续的数值数据转换为类别数据,比如将收入分成高、中和低三组,将学生成绩分为优、良、中、及格和不及格五组。

本来将基于R语言,采用三种方法来实现;第一种是对变量直接进行重新赋值,第二种是使用within函数对语句进行组织,第三种是cut函数。

首先我们定义一个数据框,这个数据框包括学生姓名和数学成绩两个变量。

#定义数据框
mathScore <- data.frame(name=c("刘文涛","王宇翔","田思雨","徐丽娜","丁文彬","李志国","王智强","宋丽芳","袁芳芳","张建国"), math=c(85, 91, 74, 100, 82, 84, 78, 100, 51, 70))
head(mathScore)

接下来我们以90、80、70和60为界,将学生的数学成绩分为优、良、中、及格和不及格五类。

方法一:直接对分组变量进行赋值

#方法一:直接对分组变量进行赋值
attach(mathScore)
mathScore$group1[math>=90]="优"
mathScore$group1[math>= 80 & math < 90] = "良"
mathScore$group1[math>= 70 & math < 80] = "中"
mathScore$group1[math>= 60 & math < 70] = "及格"
mathScore$group1[math < 60] = "不及格"
detach(mathScore)
head(mathScore)

这种方法较易理解,但使用attach函数可能会出现一些意想不到的问题,因此我们可以采用within函数,对代码进行优化,即方法二

方法二:使用within函数对变量进行分组

#方法二:使用within函数对变量进行分组
mathScore <- within(mathScore,{
  group2 <- NA
  group2[math>=90]="优"
  group2[math>= 80 & math < 90] = "良"
  group2[math>= 70 & math < 80] = "中"
  group2[math>= 60 & math < 70] = "及格"
  group2[math < 60] = "不及格"
})
head(mathScore)

在方法二中,要注意within函数的写法,赋值语句要用大括号括起来,并且每条赋值语句占一行。此外,在第一行首先定义了 group2 <- NA这个变量。

方法三:采用cut函数

采用cut函数也是较为常用的一种方法,但要注意的是需要对间段点的开闭进行设定。

#方法三:采用cut函数
mathScore$group3 <- cut(mathScore$math, breaks = c(-Inf, 60, 70, 80, 90, Inf), labels = c("不及格","及格","中","良","优"), right=FALSE)

在cut函数中:

  • breaks表示分界点,Inf表示无穷大; labels表示每个类别的名称;
  • right=FALSE表示表示区间为左闭右开,即分段时不包括右边的点,即良为[80,
    90);right=TRUE则表示左闭右开区间(默认是这种情形)

我们执行mathScore代码,就可以看到三种方法得到的结果是一致的。

关于cut函数参数的补充说明:

cut函数有两个和分界点相关的参数,一个是include.lowest,一个是right,下面对这两个参数进行详细说明。

  • right参数:right=TRUE表示左闭右开区间,right=FALSE表示左开右闭区间
  • include.lowest参数:表示包括最小值或包括最大值

下面通过例子说明:

为了说明问题,我们把数据再重新定义一下,比原数据加入两行:

#重新定义一下数据框
mathScore <- data.frame(name=c("刘文涛","王宇翔","田思雨","徐丽娜","丁文彬","李志国","王智强","宋丽芳","袁芳芳","张建国","张志伟","李明"), math=c(85, 91, 74, 100, 82, 84, 78, 100, 51, 70, 0, NA))
head(mathScore)

我们把之前代码改写一下,把-Inf替换为0,把Inf替换为100,尝试一下结果:

#问题代码示例
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","优"), right=FALSE)
mathScore

我们可以看到输出的结果如下:

name math group
1 刘文涛 85 良
2 王宇翔 91 优
3 田思雨 74 中
4 徐丽娜 100 < NA >
5 丁文彬 82 良
6 李志国 84 良
7 王智强 78 中
8 宋丽芳 100 < NA >
9 袁芳芳 51 不及格
10 张建国 70 中
11 张志伟 0 不及格
12 李明 NA < NA >

此结果有问题,因为100分不包括在内,因为 right=FALSE是左闭右开区间,这时就要改写代码,加上参数include.lowest=TRUE

如下为正确代码示例:

#正确代码示例
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","优"), right=FALSE, include.lowest=TRUE)
mathScore

这时的结果如下,我们发现是结果正确的:

name math group
1 刘文涛 85 良
2 王宇翔 91 优
3 田思雨 74 中
4 徐丽娜 100 优
5 丁文彬 82 良
6 李志国 84 良
7 王智强 78 中
8 宋丽芳 100 优
9 袁芳芳 51 不及格
10 张建国 70 中
11 张志伟 0 不及格
12 李明 NA < NA >

因为right=FALSE是左闭右开区间,加上参数include.lowest=TRUE后,意为把最大值的右端点包括了。

为了深入了解两个端点参数的关系,我们尝试动下如下两段代码:

#对参数设置尝试的代码
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","优"), right=TRUE, include.lowest=FALSE)
mathScore

此代码为左闭右开区间,不包括最小值左侧端点;

#对参数设置尝试的代码
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","优"), right=TRUE, include.lowest=TRUE)
mathScore

此代码为左闭右开区间,包括最小值区间左侧端点。

因此,right和include.lowest总结如下:

right参数 include.lowest参数 备注
FALSE TRUE 左闭右开,包括最大值端点
TRUE TRUE 左开右闭,包括最小值端点
TRUE FALSE 左开右闭,不包括最小值端点
FALSE FALSE 左闭右开,包括最小值端点

其中,cut函数默认为right = TRUE, include.lowest=FALSE;

在实际的数据分析中,一般是将参数设置为right=FALSE, include.lowest=TRUE,即含下限不含上限,包括最大值区间右侧端点。

总结

到此这篇关于R语言将变量分组的3种方法的文章就介绍到这了,更多相关R语言变量分组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • R语言关于变量的知识点总结

    变量为我们提供了我们的程序可以操作的命名存储. R语言中的变量可以存储原子向量,原子向量组或许多Robject的组合. 有效的变量名称由字母,数字和点或下划线字符组成. 变量名以字母或不以数字后跟的点开头. 变量名 合法性 原因 var_name2. 有效 有字母,数字,点和下划线 VAR_NAME% 无效 有字符'%'.只有点(.)和下划线允许的. 2var_name 无效 以数字开头 .var_name, var.name 有效 可以用一个点(.),但启动点(.),不应该后跟一个数字. .2

  • R语言变量重编码、重命名的操作

    1.变量重编码 重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程,如将符合某个条件的值重新赋值等,这里主要介绍两种常见的方法: #第一种方法 per <- data.frame(name = c("张三","李四","王五","赵六"), age = c(23,45,34,1000)) per per$age[per$age == 1000] <- NA #设置缺失值 per$age1[per$age

  • R语言变量赋值深入讲解

    变量可以使用向左,向右且等于操作符来分配值.可以使用 print() 或 cat() 函数打印变量的值.cat() 函数将多个项目并成连续并打印输出. # Assignment using equal operator. var.1 = c(0,1,2,3) # Assignment using leftward operator. var.2 <- c("learn","R") # Assignment using rightward operator. c

  • R语言将变量分组的3种方法实例(含cut函数说明)

    目录 前言 方法一:直接对分组变量进行赋值 方法二:使用within函数对变量进行分组 方法三:采用cut函数 总结 前言 在数据处理的过程中,我们有时候需要将连续的数值数据转换为类别数据,比如将收入分成高.中和低三组,将学生成绩分为优.良.中.及格和不及格五组. 本来将基于R语言,采用三种方法来实现:第一种是对变量直接进行重新赋值,第二种是使用within函数对语句进行组织,第三种是cut函数. 首先我们定义一个数据框,这个数据框包括学生姓名和数学成绩两个变量. #定义数据框 mathScor

  • R语言导入导出数据的几种方法汇总

    导出: 对于某一数据集导出文件的方法 导出例子:write.csv(data_1,file = "d:/1111111111.csv") 其中data_1是你的数据集,file是你的存储路径和要存储的名字 导入: 1  使用键盘输入数据 (1) 创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致: (2)针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回此数据对象中. 在下例中,你将创建一个名为mydata的数据框,它含有三个变量:age(数值型).

  • C语言格式输出二进制的2种方法总结

    目录 1.前言 2.源码实现 3.结果展示 附:C语言如何将一个数字的二进制形式输出出来 总结 1.前言 在我们日常的编程中,有时候需要格式化输出一个整形数据的二进制,但是在我们C语言中只有 输出十进制:%d: 输出十六进制:%x: 输出单个字符:%c: 输出字符串:%s: 输出变量所在的地址:%p: 而并没有这种二进制对应的格式,所以需要我们手动来实现. 2.源码实现 本篇博客给大家介绍两种方法: 1.通过库函数itoa,需要包含头文件:#include <stdlib.h>: 2.通过十进

  • C语言实现倒置字符串的两种方法分享

    目录 前言 一.题目 二.思路讲解 三.代码实现 四.代码总结 五.第二种方法倒置字符串 六.总结 前言 今天在牛客网上刷了一道题,我感觉挺有意义的,现在我就分享给大家,并且告诉大家解题思路. 一.题目 事例: 输入下列字符: I like beijing. 输出的字符: beijing. like I 二.思路讲解 1.设立一个数组存放输入的字符串 2.将其中每个单词进行逆置 得到 I ekil .gnjieb 3.再将字符串逆置  得到beijing.like I 三.代码实现 1.设立一个

  • C语言实现求解素数的N种方法总结

    目录 前言 必备小知识 C语言详解<试除法>求解素数 试除法境界1 试除法境界2 试除法境界3 试除法境界4 C语言详解<筛选法>求解素数 筛选法境界5 前言 哈喽各位友友们,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!我仅已此文,手把手带领大家探讨利用试除法.筛选法求解素数的n层境界!都是精华内容,可不要错过哟!!! 必备小知识 质数又称素数.一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数:否则称为合数(规定1既不是质数也不是合数).这里

  • CentOS实现将php和mysql命令加入到环境变量中的几种方法

    CentOS实现将php和mysql命令加入到环境变量中的几种方法 前言: Linux CentOS配置LAPM环境时,为了方便,将PHP和MySQL命令加到系统环境命令,下面我们记录几种在linux下将php和mysql加入到环境变量中的方法. 如果在没有添加到环境变量之前,执行"php -v"命令查看当前php版本信息时时,则会提示命令不存在的错误,下面我们详细介绍一下在linux下将php和mysql加入到环境变量中的方法. 假设php和mysql分别安装在/usr/local/

  • JavaScript复制变量三种方法实例详解

    这篇文章主要介绍了JavaScript复制变量三种方法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 直接将一个变量赋给另一个变量时,系统并不会创造一个新的变量,而是将原变量的地址赋给了新变量名.举个栗子: 复制代码 复制代码 let obj = { a: 1, b: 2, }; let copy = obj; obj.a = 5; console.log(copy.a); // Result // a = 5; // 更改obj的值,

  • Go语言拼接URL路径的三种方法

    目录 JoinPath ResolveReference path.Join 参考 Go语言拼接URL路径有多种方法建议用ResolveReference. JoinPath JoinPath会把多个多个路径合并成一个路径,并且处理../和./,多个//合并成单个/. package main import (     "fmt"     "net/url" ) func main() {     u1 := "http://example.com/dir

  • Android 中Popwindow弹出菜单的两种方法实例

    Android 中Popwindow弹出菜单的两种方法实例 1.popWindow就是对话框的一种方式! 此文讲解的android中对话框的一种使用方式,它叫popWindow. 2.popWindow的特性 Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于: AlertDialog的位置固定,而PopupWindow的位置可以随意. AlertDialog是非阻塞线程的,而PopupWindow是阻塞线程的. PopupWindow的位置按照有无偏

随机推荐