R语言-进行数据的重新编码(recode)操作

在分析数据时我们经常会遇到将变量值转换成其他的值的情况(如:将连续变量转成分类变量)这时就需要我们对原有数据进行重新编码。本文将介绍R软件中常用的三种重编吗方法:

1、使用逻辑判断式编码。

2、使用cut函数编码。

3、使用car程序包的recode函数。

(一)使用逻辑判断式

(1)现假设我们需要将下面的连续型变量x按照10与20分成三个组,新的分组名称为1、2、3:

> x2=1*(x<=10)+2*(x>10&x<=20)+3*(x>20)
> x2
 [1] 1 2 3 2 3 3 3 3 1 3 3 2 1 2 3 3 3 2 3 3

将上述变量的数字编码改为字符编码

> labels=c("A","B","C")
> x3=labels[x2]
> x3
 [1] "A" "B" "C" "B" "C" "C" "C" "C" "A" "C" "C" "B" "A" "B" "C" "C" "C" "B" "C" "C"

假设如下将以下范例月收入数据分成“低收入”,“中等收入”,“高收入”三个组:

> income<-c(130065,82961,133076,123028,108945,173466,17477)
> income
[1] 130065  82961 133076 123028 108945 173466  17477
> newcodes=c("低收入","中等收入","高收入")
Error: unexpected input in "newcodes=c("低收入"?
> newcodes=c("低收入","中等收入","高收入")
> index=1*(income<20000)+2*(income>=20000&income<=60000)+3*(income>60000)
> income=newcodes[index]
> income
[1] "高收入" "高收入" "高收入" "高收入" "高收入" "高收入" "低收入"

(2)使用ifelse函数

基本语法:ifelse(逻辑判断式,TRUE-表达式,FALSE-表达式)

编码成两个分组:

> x
 [1]  4 12 50 18 50 22 23 46  8 46 36 18 10 14 35 48 23 17 29 30
> (x2=ifelse(x<=30,1,2))
 [1] 1 1 2 1 2 1 1 2 1 2 2 1 1 1 2 2 1 1 1 1
> (x3=ifelse(x<=30,"A","B"))
 [1] "A" "A" "B" "A" "B" "A" "A" "B" "A" "B" "B" "A" "A" "A" "B" "B" "A" "A" "A" "A"

搭配%int%运算符,将"A",“C"重编码为"Group1”,“B”,“D"重编码为"Group2”:

> y
 [1] "B" "A" "C" "C" "B" "A" "D" "B" "C" "D"
 > (y2=ifelse(y %in% c("A","C"),"Group1","Group2"))
 [1] "Group2" "Group1" "Group1" "Group1" "Group2" "Group1" "Group2" "Group2" "Group1" "Group2"

当编码成三个或者三个以上的组时需要多次使用ifelse 函数:

将x按照10与20两个分割点分成1、2、3三组:

> x
 [1]  4 12 50 18 50 22 23 46  8 46 36 18 10 14 35 48 23 17 29 30
> (x2=ifelse(x<=10,1,ifelse(x<20,2,3)))
 [1] 1 2 3 2 3 3 3 3 1 3 3 2 1 2 3 3 3 2 3 3

将“A”“E”编码为1,"C"编码为2,“B”“D”编码为3:

> y
 [1] "B" "A" "C" "C" "B" "A" "D" "B" "C" "D"
> y2=ifelse(y%in%c("A","E"),1,ifelse(y=="C",2,3))
> y2
 [1] 3 1 2 2 3 1 3 3 2 3

(二)使用cut 函数

cut函数可以根据我们设置的分割点(breaks)将数据重编码,将一个数值向量变量转换为分组形态的factors变量。

基本语法:

cut(x,breaks,labels,include.lowest=F,right=T)

其中

x为数值向量

breaks为分割点信息。若breaks为向量,则根据向量中的数字进行分割。若breaks为大于1正整数k,则将

x分成均等的k组。

labels为分割后各组的名称,若为null,则输出数字向量,否则输出factor变量。

include.lowest=FALSE表示分割时不含各区间端点的最小值。

right=T表示各区间为左端open,右端closed的区间

使用cut函数将x向量依照0、10、20,max(x)分成3组

> x
 [1]  4 12 50 18 50 22 23 46  8 46 36 18 10 14 35 48 23 17 29 30
> x2=cut(x,breaks = c(0,10,20,max(x)),labels = c(1,2,3))
> x2
 [1] 1 2 3 2 3 3 3 3 1 3 3 2 1 2 3 3 3 2 3 3
Levels: 1 2 3
> as.vector(x2)
 [1] "1" "2" "3" "2" "3" "3" "3" "3" "1" "3" "3" "2" "1" "2" "3" "3" "3" "2" "3" "3"

若没有给定labels参数,cut函数自动按照分割点生成分组名称:

x3=cut(x,breaks = c(0,10,20,max(x)))
> x3
 [1] (0,10]  (10,20] (20,50] (10,20] (20,50] (20,50] (20,50] (20,50] (0,10]  (20,50] (20,50] (10,20] (0,10]
[14] (10,20] (20,50] (20,50] (20,50] (10,20] (20,50] (20,50]
Levels: (0,10] (10,20] (20,50]

现在我们模拟产生10个N(60,10)的随机成绩,并且使用cut函数的breaks选项将其分成5个组:

> score=round(rnorm(10,60,10))
> score
 [1] 39 65 60 69 58 69 70 62 61 75
> score.cut=cut(score,breaks=5)
> score.cut
 [1] (39,46.2]   (60.6,67.8] (53.4,60.6] (67.8,75]   (53.4,60.6] (67.8,75]   (67.8,75]   (60.6,67.8]
 [9] (60.6,67.8] (67.8,75]
Levels: (39,46.2] (46.2,53.4] (53.4,60.6] (60.6,67.8] (67.8,75]

由以上结果可知,cut()函数默认输出一个factor变量,并且自动将五个分组命名为“ (39,46.2]”…“ (67.8,75]”。如果cut()的选项labels=FALSE,则输出的结果是数字编码的一半向量变量:

> score.cut=cut(score,breaks=5,labels = F)
> score.cut
 [1] 1 4 3 5 3 5 5 4 4 5
> score.cut=as.factor(score.cut)
> score.cut
 [1] 1 4 3 5 3 5 5 4 4 5
Levels: 1 3 4 5

(三)使用car程序包中的recode函数

car程序包的recode函数可以将数值或者字符向量、factor变量重新编码。

基本语法:recode(x,recodes,as.factor.result,levels)

其中:

x为数值向量,字符向量或者factor 变量。

recode为设定重新编码规则的字符串。

as.factor.result为是否输出factor变量。若是则为TRUE,不是为FALSE。

levels为排序向量。指定新的编码分组的顺序(默认是按照分组名称排序)。

recodes参数编码规则的写法

recodes参数的值是一个字符串,字符串里面是以分号分隔的编码规则:

recodes=“规则1;规则2…”

每一个编码规则的格式为旧码列表=新码,“旧码列表”部分可用lo代表旧码的最小值(low)、hi代表旧码的最大值(high)撰写规则如下:

(1)旧码=新码 旧码只有单一数值。例如:“0=NA”表示将0改为NA。

(2)旧码向量=新码 多个旧码改为一个新码。例如:“c(7,8,9)=‘high'”,将7,8,9改为high。

(3)start:end=新码 有序数字改码。例如:“lo:19=‘C'”。

(4)else=新码 所有其他情况。例如:“else=NA”。

程序范例:

> library(carData)
> library(car)
> x
[1] 1 2 3 1 2 3 1 2 3
> recode(x,"c(1,2)='A';else='B'")
[1] "A" "A" "B" "A" "A" "B" "A" "A" "B"

将成绩0~40分之间的分数编码为1,41-60分之间为2,61-80分为3,81以上为4,其他情况为NA

> score
 [1] 75 70 66 65 55 69 75 69 82 83
> recode(score,"lo:40=1;41:60=2;61:80=3;81:hi=4;else=NA")
 [1] 3 3 3 3 2 3 3 3 4 4

上例改用‘A'‘B'‘C''‘D'

> recode(score,"lo:40='A';41:60='B';61:80='C';81:hi='D';else=NA")
 [1] "C" "C" "C" "C" "B" "C" "C" "C" "D" "D"

补充:R语言字符串处理时的编码的一些问题问题(Windows环境)

R在windows中文系统时默认使用GB编码字符,而许多函数是只支持UTF-8的,例如

不作任何处理读入数据时,数据会以系统默认编码读入,tolower()函数工作失败

如果有干预的读入数据,即指定字符串的编码,则不会出错

数据库读写中文出现乱码的原理也是相似的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • R语言数据读取以及数据保存方式

    一.R语言读取文本文件: 1.文件目录操作: getwd() : 返回当前工作目录 setwd("d:/data") 更改工作目录 2.常用的读取指令read read.table() : 读取文本文件 read.csv(): 读取csv文件 如果出现缺失值,read.table()会报错,read.csv()读取时会自动在缺失的位置填补NA 3.灵活的读取指令 scan() : 4.读取固定宽度格式的文件: read.fwf() 文本文档中最后一行的回车符很重要,这是一个类似于停止符

  • R语言之xlsx包读写Excel数据的操作

    感谢Adrian A. Drǎgulescu发布的xlsx包 xlsx包提供了必要的工具来与Excel 2007进行交互.用户可以阅读和编写xlsx,并可以通过设置数据格式.字体.颜色和边框来控制电子表格的外观.设置打印区域,缩放控制,创建分割和冻结面板,添加页眉和页脚.包使用Apache POI项目中的java库.本篇主要分享利用xlsx工具包在读写xlsx过程中所碰到的问题及解决办法. 工具准备 强烈建议大家使用RStudio这个IDE,它是以今为止对R语言最友好的一个IDE之一,而且使用很

  • R语言-如何定义数据框的列名

    1.在定义数据框时,定义列名: 例如: a<-c(2,23,45,6,7,1,6,7) b<-c(4,6,1,2,5,66,10,2) df<-data.frame(a,b) 此时数据框df中的列名分别是a.b 也可以如下: df<-data.frame(a1=a,b1=b) 此时的列名是a1.b1 2.修改数据框中列的名字 如果希望修改数据框中的列名,可以使用name函数进行修改 例如: names(df)<-c("a2","b2")

  • R语言变量级别的数据处理操作

    变量级别的数据处理无非是对变量的增删改查. 增 即增加新的变量 R语言中,增加一个新变量形式语句如下: 变量名 <- 表达式 表达式可以包含多种运算符和函数.常见运算符包括: 运算符 描述 + 加 - 减 * 乘 / 除 ^或** 求幂 x%%y 求余(x mod y).5%%2的结果为1. x%/%y 整数除法.5%/%2的结果为2. 示例: #创建一个数据框 mydata <- data.frame(x1 = c(2,2,6,4), + x2 = c(3,4,2,8)) mydata x1

  • R语言关于数据帧的知识点详解

    数据帧是表或二维阵列状结构,其中每一列包含一个变量的值,并且每一行包含来自每一列的一组值. 以下是数据帧的特性. 列名称应为非空. 行名称应该是唯一的. 存储在数据帧中的数据可以是数字,因子或字符类型. 每个列应包含相同数量的数据项. 创建数据帧 # Create the data frame. emp.data <- data.frame( emp_id = c (1:5), emp_name = c("Rick","Dan","Michelle&

  • r语言-如何将数据标准化和中心化

    中心化和标准化意义一样,都是消除量纲的影响 中心化:数据-均值 标准化:(数据-均值)/标准差 数据中心化: scale(data,center=T,scale=F) 数据标准化: scale(data,center=T,scale=T) 或默认参数scale(data) scale方法中的两个参数center和scale的解释: 1.center和scale默认为真,即T或者TRUE 2.center为真表示数据中心化 3.scale为真表示数据标准化 补充:R语言对数据进行标准化处理 有时候

  • R语言实现用cbind合并两列数据

    我有两个数据文件,分别只有一列,这两列数据行数一行,我想把这两列合并到一个数据文件中,方便使用. 我的两个数据文件分别是1.txt,2.txt,保存后的文件名是3.txt. // 代码如下 gow1<-read.table("1.txt",header = FALSE) gow2<-read.table("2.txt",header = FALSE) View(gow1) View(gow2) gow<-cbind(gow1,gow2) View(

  • R语言-使用ifelse进行数据分组

    数据分组,根据数据分析对象的特征,按照一定的数值指标,把数据分析对象划分为不同的区间部分来研究,以揭示内在的联系和规律性: 在R中,我们常用ifelse函数来进行数据的分组,跟excel中的if函数是同一种用法. ifelse(condition,TRUE,FALSE) > data <- read.table('1.csv', sep='|', header=TRUE); > > level <- ifelse( + data$cost<=20, "(0,2

  • R语言-进行数据的重新编码(recode)操作

    在分析数据时我们经常会遇到将变量值转换成其他的值的情况(如:将连续变量转成分类变量)这时就需要我们对原有数据进行重新编码.本文将介绍R软件中常用的三种重编吗方法: 1.使用逻辑判断式编码. 2.使用cut函数编码. 3.使用car程序包的recode函数. (一)使用逻辑判断式 (1)现假设我们需要将下面的连续型变量x按照10与20分成三个组,新的分组名称为1.2.3: > x2=1*(x<=10)+2*(x>10&x<=20)+3*(x>20) > x2 [1

  • R语言的数据输入深入讲解

    既然了解了R语言的基本数据类型,那么如何将庞大的数据送入R语言进行处理呢?送入的数据又是如何在R语言中进行存储的呢?处理这些数据的方法又有那些呢?下面我们一起来探讨一下. 首先,数据输入最直接最直观的方法就是键盘输入,在上面几篇都已经讲到,利用c创建向量,利用matrix创建矩阵,利用data.frame创建数据框等,但是我们处理的数据往往比较多,键盘输入在面对如此庞大的数据时显然不现实,当然你可以花费好几天来输入数据而且保证不出错除外,而且待处理的一般都存储在Excel,网页,数据库其他中介中

  • 用R语言实现霍夫曼编码的示例代码

    可读性极低,而且其实也没必要用R语言写,图个乐罢了 p=c(0.4,0.2,0.2,0.1,0.1)###输入形如c(0.4,0.2,0.2,0.1,0.1)的概率向量,即每个待编码消息的发生概率 p1=p###将概率向量另存,最后计算编码效率要用 mazijuzhen=matrix(,nrow=length(p),ncol=length(p)-1)###码字矩阵:第i行对应向量p的第i个分量所对应的那个待编码消息的编码后的码字 group=matrix(c(1:length(p),rep(NA

  • R语言绘图数据可视化Ridgeline plot山脊图画法

    目录 Step1. 绘图数据的准备 Step2. 绘图数据的读取 Step3. 绘图所需package的安装.调用 Step4. 绘图 调整透明度 更改顺序 更改线条形状 今天给大家介绍一下Ridgeline plot(山脊图)的画法. 作图数据如下: Step1. 绘图数据的准备 首先要把你想要绘图的数据调整成R语言可以识别的格式,建议大家在excel中保存成csv格式. Step2. 绘图数据的读取 data<-read.csv("your file path", heade

  • R语言绘制数据可视化小提琴图画法示例

    目录 Step1. 绘图数据的准备 Step2. 绘图数据的读取 Step3. 绘图所需package的安装.调用 Step4. 绘图 小提琴图之前已经画过了,不过最近小仙又看到一种貌美的画法,决定复刻一下.文献中看到的图如下: Step1. 绘图数据的准备 首先要把你想要绘图的数据调整成R语言可以识别的格式,建议大家在excel中保存成csv格式.作图数据如下: Step2. 绘图数据的读取 data<-read.csv("your file path", header = T

  • R语言绘图数据可视化pie chart饼图

    目录 Step 1. 绘图数据的准备 Step2. 绘图数据的读取 Step3.绘图所需package的调用 Step4. 饼图百分比标签准备 Step5.绘图 今天要给大家介绍的Pie chart(饼图),本来是不打算写这个的,因为用Excel画饼图实在是太方便了.本着能少动一下是一下的懒人原则,是不打算用R画的,再说,本小仙不是掌握了R作图大器ggplot2么,实在需要用的时候我就一句ggplot()+geom_pie()不就搞定了. 结果后来用Excel画饼图调整颜色.大小的时候着实有些崩

  • R语言绘制数据可视化小提琴图Violin plot with dot画法

    目录 Step1.绘图数据的准备 Step2.绘图数据的读取 Step3.绘图所需package的安装.调用 Step4.绘图 小提琴图之前已经画过了,不过最近小仙又看到一种貌美的画法,决定复刻一下.文献中看到的图如下: Step1. 绘图数据的准备 首先要把你想要绘图的数据调整成R语言可以识别的格式,建议大家在excel中保存成csv格式.作图数据如下: Step2. 绘图数据的读取 data<-read.csv("your file path", header = T) #注

  • R语言绘图数据可视化pie chart饼图

    目录 Step 1. 绘图数据的准备 Step2. 绘图数据的读取 Step3.绘图所需package的调用 Step4. 饼图百分比标签准备 Step5.绘图 今天要给大家介绍的Pie chart(饼图),本来是不打算写这个的,因为用Excel画饼图实在是太方便了.本着能少动一下是一下的懒人原则,是不打算用R画的,再说,本小仙不是掌握了R作图大器ggplot2么,实在需要用的时候我就一句ggplot()+geom_pie()不就搞定了. 结果后来用Excel画饼图调整颜色.大小的时候着实有些崩

  • R语言开发之CSV文件的读写操作实现

    在R中,我们可以从存储在R环境外部的文件读取数据,还可以将数据写入由操作系统存储和访问的文件.这个csv文件应该存在于当前工作目录中,以方便R可以读取它, 当然,也可以设置自己的目录,并从那里读取文件. 我们可以使用getwd()函数来检查R工作区指向哪个目录,并且使用setwd()函数设置新的工作目录,如下: 输出结果如下: csv文件是一个文本文件,其中列中的值用逗号分隔,我们可以将以下数据保存入txt文件中,并且修改后缀名称为csv: id,name,salary,start_date,d

  • R语言绘制数据可视化Dumbbell plot哑铃图

    目录 Step1. 绘图数据的准备 Step3. 绘图所需package的安装.调用 Step4. 绘图 改变size的大小 调整顺序 又是一年春来到,小仙祝大家在新的一年开开心心.顺顺利利!今天给大家分享的图是哑铃图(Dumbbell plot). Step1. 绘图数据的准备 首先要把你想要绘图的数据调整成R语言可以识别的格式,建议大家在excel中保存成csv格式.作图数据格式如下: Step2. 绘图数据的读取 data <- read.csv("your file path&qu

随机推荐