網(wǎng)站首頁 編程語言 正文
前言
在數(shù)據(jù)處理的過程中,我們有時候需要將連續(xù)的數(shù)值數(shù)據(jù)轉(zhuǎn)換為類別數(shù)據(jù),比如將收入分成高、中和低三組,將學生成績分為優(yōu)、良、中、及格和不及格五組。
本來將基于R語言,采用三種方法來實現(xiàn);第一種是對變量直接進行重新賦值,第二種是使用within函數(shù)對語句進行組織,第三種是cut函數(shù)。
首先我們定義一個數(shù)據(jù)框,這個數(shù)據(jù)框包括學生姓名和數(shù)學成績兩個變量。
#定義數(shù)據(jù)框
mathScore <- data.frame(name=c("劉文濤","王宇翔","田思雨","徐麗娜","丁文彬","李志國","王智強","宋麗芳","袁芳芳","張建國"), math=c(85, 91, 74, 100, 82, 84, 78, 100, 51, 70))
head(mathScore)
接下來我們以90、80、70和60為界,將學生的數(shù)學成績分為優(yōu)、良、中、及格和不及格五類。
方法一:直接對分組變量進行賦值
#方法一:直接對分組變量進行賦值
attach(mathScore)
mathScore$group1[math>=90]="優(yōu)"
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函數(shù)可能會出現(xiàn)一些意想不到的問題,因此我們可以采用within函數(shù),對代碼進行優(yōu)化,即方法二
方法二:使用within函數(shù)對變量進行分組
#方法二:使用within函數(shù)對變量進行分組
mathScore <- within(mathScore,{
group2 <- NA
group2[math>=90]="優(yōu)"
group2[math>= 80 & math < 90] = "良"
group2[math>= 70 & math < 80] = "中"
group2[math>= 60 & math < 70] = "及格"
group2[math < 60] = "不及格"
})
head(mathScore)
在方法二中,要注意within函數(shù)的寫法,賦值語句要用大括號括起來,并且每條賦值語句占一行。此外,在第一行首先定義了 group2 <- NA這個變量。
方法三:采用cut函數(shù)
采用cut函數(shù)也是較為常用的一種方法,但要注意的是需要對間段點的開閉進行設定。
#方法三:采用cut函數(shù)
mathScore$group3 <- cut(mathScore$math, breaks = c(-Inf, 60, 70, 80, 90, Inf), labels = c("不及格","及格","中","良","優(yōu)"), right=FALSE)
在cut函數(shù)中:
- breaks表示分界點,Inf表示無窮大; labels表示每個類別的名稱;
- right=FALSE表示表示區(qū)間為左閉右開,即分段時不包括右邊的點,即良為[80,
90);right=TRUE則表示左閉右開區(qū)間(默認是這種情形)
我們執(zhí)行mathScore代碼,就可以看到三種方法得到的結(jié)果是一致的。
關于cut函數(shù)參數(shù)的補充說明:
cut函數(shù)有兩個和分界點相關的參數(shù),一個是include.lowest,一個是right,下面對這兩個參數(shù)進行詳細說明。
- right參數(shù):right=TRUE表示左閉右開區(qū)間,right=FALSE表示左開右閉區(qū)間
- include.lowest參數(shù):表示包括最小值或包括最大值
下面通過例子說明:
為了說明問題,我們把數(shù)據(jù)再重新定義一下,比原數(shù)據(jù)加入兩行:
#重新定義一下數(shù)據(jù)框
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,嘗試一下結(jié)果:
#問題代碼示例
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","優(yōu)"), right=FALSE)
mathScore
我們可以看到輸出的結(jié)果如下:
name math group
1 劉文濤 85 良
2 王宇翔 91 優(yōu)
3 田思雨 74 中
4 徐麗娜 100 < NA >
5 丁文彬 82 良
6 李志國 84 良
7 王智強 78 中
8 宋麗芳 100 < NA >
9 袁芳芳 51 不及格
10 張建國 70 中
11 張志偉 0 不及格
12 李明 NA < NA >
此結(jié)果有問題,因為100分不包括在內(nèi),因為 right=FALSE是左閉右開區(qū)間,這時就要改寫代碼,加上參數(shù)include.lowest=TRUE
如下為正確代碼示例:
#正確代碼示例
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","優(yōu)"), right=FALSE, include.lowest=TRUE)
mathScore
這時的結(jié)果如下,我們發(fā)現(xiàn)是結(jié)果正確的:
name math group
1 劉文濤 85 良
2 王宇翔 91 優(yōu)
3 田思雨 74 中
4 徐麗娜 100 優(yōu)
5 丁文彬 82 良
6 李志國 84 良
7 王智強 78 中
8 宋麗芳 100 優(yōu)
9 袁芳芳 51 不及格
10 張建國 70 中
11 張志偉 0 不及格
12 李明 NA < NA >
因為right=FALSE是左閉右開區(qū)間,加上參數(shù)include.lowest=TRUE后,意為把最大值的右端點包括了。
為了深入了解兩個端點參數(shù)的關系,我們嘗試動下如下兩段代碼:
#對參數(shù)設置嘗試的代碼
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","優(yōu)"), right=TRUE, include.lowest=FALSE)
mathScore
此代碼為左閉右開區(qū)間,不包括最小值左側(cè)端點;
#對參數(shù)設置嘗試的代碼
mathScore$group <- cut(mathScore$math, breaks = c(0, 60, 70, 80, 90, 100), labels = c("不及格","及格","中","良","優(yōu)"), right=TRUE, include.lowest=TRUE)
mathScore
此代碼為左閉右開區(qū)間,包括最小值區(qū)間左側(cè)端點。
因此,right和include.lowest總結(jié)如下:
right參數(shù) | include.lowest參數(shù) | 備注 |
---|---|---|
FALSE | TRUE | 左閉右開,包括最大值端點 |
TRUE | TRUE | 左開右閉,包括最小值端點 |
TRUE | FALSE | 左開右閉,不包括最小值端點 |
FALSE | FALSE | 左閉右開,包括最小值端點 |
其中,cut函數(shù)默認為right = TRUE, include.lowest=FALSE;
在實際的數(shù)據(jù)分析中,一般是將參數(shù)設置為right=FALSE, include.lowest=TRUE,即含下限不含上限,包括最大值區(qū)間右側(cè)端點。
總結(jié)
原文鏈接:https://blog.csdn.net/AhaBob/article/details/120639097
相關推薦
- 2023-01-08 Flutter開發(fā)技巧ListView去除水波紋方法示例_Android
- 2022-06-09 4種方法python批量修改替換列表中元素_python
- 2022-06-01 docker安裝nginx并配置ssl的方法步驟_docker
- 2022-11-01 python?類對象的析構(gòu)釋放代碼演示_python
- 2023-02-07 C#實現(xiàn)自定義屏保的示例代碼_C#教程
- 2022-09-21 Django中外鍵使用總結(jié)_python
- 2022-09-13 Python使用os模塊實現(xiàn)更高效地讀寫文件_python
- 2023-04-26 C++利用伴隨陣法實現(xiàn)矩陣求逆_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支