时间:2021-05-20
在分析数据时我们经常会遇到将变量值转换成其他的值的情况(如:将连续变量转成分类变量)这时就需要我们对原有数据进行重新编码。本文将介绍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 3cut函数可以根据我们设置的分割点(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 3Levels: 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 5Levels: 1 3 4 5car程序包的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()函数工作失败
如果有干预的读入数据,即指定字符串的编码,则不会出错
数据库读写中文出现乱码的原理也是相似的。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一.Base64的编码规则Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺
一.Base64的编码规则Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组。按顺
文件中包含图像音频视频,渲染的意思就是把文件中的图像音频视频进行重新编辑制成影片格式,无法渲染也就是不能识别编码方式,或检查到影像文件不完整,无法进行重新编辑了
既然了解了R语言的基本数据类型,那么如何将庞大的数据送入R语言进行处理呢?送入的数据又是如何在R语言中进行存储的呢?处理这些数据的方法又有那些呢?下面我们一起来
由于JavaScript属于弱类型脚本语言,因此当其与强类型的后台语言进行数据交互时会产生各种问题,特别是加解密的操作。本人由于工作中遇到用js与Java进行相