在分析数据时我们经常会遇到将变量值转换成其他的值的情况(如:将连续变量转成分类变量)这时就需要我们对原有数据进行重新编码。本文将介绍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

> 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()函数工作失败

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

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

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

linux r语言 指定编码,R语言-进行数据的重新编码(recode)操作相关推荐

  1. c语言usb串口输出,C语言实现模拟USB对8bit数据的NRZI编码输出

    USB的NRZI编码方式,将原数据进行处理,原数据为0时,编码成电平翻转,原数据为1时,编码成电平不翻转,USB要发送数据的时候,硬件把数据流转化成为NRZI编码,然后经过USB的差分线D+和D-将数 ...

  2. 实现对mysql增删改查_Java语言实现对MySql数据库中数据的增删改查操作的代码

    简单说操作的步骤: 1.连接数据库 2.将SQL语句发送到数据库 3.执行SQL语句 这里举个例子: 在一个数据库中有个students表,表中有学号(Id),姓名(Name),性别(Sex),地址( ...

  3. R语言使用subset函数基于组合逻辑筛选dataframe符合条件的数据行(select observations)、并指定需要保留的dataframe数据列或者字段

    R语言使用subset函数基于组合逻辑筛选dataframe符合条件的数据行(select observations).并指定需要保留的dataframe数据列或者字段 目录

  4. R语言使用dplyr将特定的数据列移动到最前面、使用dplyr将特定数据列移动到另一指定数据列的后面、使用dplyr将特定数据列移动到另一指定数据列的前面

    R语言使用dplyr将特定的数据列移动到最前面.使用dplyr将特定数据列移动到另一指定数据列的后面.使用dplyr将特定数据列移动到另一指定数据列的前面 目录

  5. R语言dplyr包使用recode函数进行数据列内容编码、转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)

    R语言dplyr包使用recode函数进行数据列内容编码.转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值) 目录

  6. R语言命令行写linux,linux命令行下使用R语言绘图实例讲解

    使用系统:centos 6.4 64bit 在R语言中可以使用png()等函数生成图片,例如: png("aa.png")可以生成图片. 但是如果你是通过shell远程连接到系统上 ...

  7. Linux系统更新最新版R语言方法

    Linux系统更新最新版R语言方法 第一:卸载之前的版本 sudo apt remove r-base-core 第二:在 /etc/apt/sources中添加源 sudo vi /etc/apt/ ...

  8. R语言使用scale函数将向量数据或者dataframe指定数据列转换为Z分数(z-Scores、转化为规范化数据)

    R语言使用scale函数将向量数据或者dataframe指定数据列转换为Z分数(z-Scores.转化为规范化数据) 目录

  9. R语言使用单个向量创建矩阵数据、通过byrow参数指定从向量转化为矩阵的过程中的数据排布方式

    R语言使用单个向量创建矩阵数据.通过byrow参数指定从向量转化为矩阵的过程中的数据排布方式 目录 R语言使用单个向量创建矩阵数据.通过byrow参数指定从向量转化为矩阵的过程中的数据排布方式 R语言 ...

最新文章

  1. 杂谈 - 开始认认真真写博客了
  2. 网络学习笔记网络通讯
  3. java面向对相取钱存钱_java面向对象(银行存款业务无客户)
  4. makefile 打印变量_[Makefile] 缩进与空格--记录踩过的坑
  5. [css]怎么改变选中文本的文字颜色和背景色?
  6. 细说ReactiveCocoa的冷信号与热信号(三):怎么处理冷信号与热信号
  7. ubuntu mysql 初始化_Ubuntu初始化MySQL碰到的坑
  8. NI Vision for LabVIEW 基础(二):准备测量图像
  9. 《Python编程从入门到实践》记录之将Python函数存储在模块中(import、import*)
  10. iconfont使用
  11. javascript案例大全_JavaScript 中文资源大全,你值得拥有
  12. 约瑟夫问题(猴子选大王)
  13. 字符串(后缀自动机):COGS 2399. 循环同构
  14. c语言程序设计精髓第七周编程题,C语言程序设计精髓编程题在线测试
  15. 动手实现图像双线性插值——实现图像resize
  16. 程序员不做独行侠——沟通的核心是感受
  17. 拉普拉斯金字塔图像融合原理
  18. 微信图片怎样在pc 端打开查看并导出
  19. gb2312的字符串(包括中午)转16进制字符串以及反转义原始字符
  20. 数据结构中ElemType是什么意思

热门文章

  1. 生产制造追溯系统-条码打印
  2. keyshot分辨率多少合适_拍照时,分辨率设置成多少才合适呢?
  3. 三农优购隐私政策服务协议
  4. ASP.NET MVC 发布IIS HTTP 错误 403.14 - Forbidden
  5. ipad拓展linux屏幕,iPad “随航”功能可以把 iPad 变成 Mac 的扩展屏幕 要如何使用?...
  6. mysql普通索引命中_MySQL中因字段字符集不同导致索引不能命中的解决方法
  7. 小牛的学习笔记--乳腺癌症数据分析
  8. geoserver解决跨域问题与wps安装
  9. java boolean 语法_Java Boolean booleanValue()方法
  10. 基于opencv的人脸检测与识别(python)(1)