R语言之数据重塑

2020-06-16 00:00:00 数据 函数 变量 观测 编码

作者:刘顺祥 公众号:数据分析1480 (微信ID:lsxxx2011)
配套教程:手把手教你做文本挖掘 edu.hellobi.com/course/



向数据框中添加新的列,以数据集Loblolly为例。

该数据集包含了各种树的高度和年龄,以下通过三种方式加以实现新增变量:

方法一:使用一个$符



方法二:within函数 必须在新添加的变量中加上花括号


也可以使用with函数,该函数可以用于任何表达式的计算,但每次只能生成一个计算字段,后还需要结合使用cbind函数



方法三:transform函数



删除数据框中的某一列:建议使用subset函数,只需在删除的列前添加负号即可。



更改数据框中所有数值变量的值,可以考虑结合使用apply函数和sapply函数。例如,现在想对x1和x2的列进行转换,转换为原来值的平方再对数。



变量的重编码:即根据已有的变量重新编码,如连续变量的离散化。例如,现在想把data9中的x变量重编码,x<13则编码为1,x>=13且x<15则编码为2,剩余的编码为3。



实际上R中有专门的重编码函数,car包中recode的函数可以非常灵活的对某个已有的变量进行重新编码。但我觉得在对连续变量进行分组操作时显得有点不方便,对于区间[1.2,5.5)表示成‘1.2:5.5 = 1’,但该函数会把5.5分配到该区间中。

library(car)

语法:

recode(var, recodes, as.factor.result, as.numeric.result=TRUE, levels)

var为一个数值向量,recodes为重编码的规则。

对于变量的重编码问题,相比较within和recode函数,我个人更喜欢使用within函数。

有时在数据处理过程中需要将长型数据框转化为宽型数据框或者将宽型数据框转换为长型数据框。

宽型数据框:一个观测(id)记录在一行中,没有重复的id出现

长型数据框:一个观测(id)记录在多行中,会有重复的id出现

例如以下的数据框df1为宽型,df2为长型



对于宽型数据框转换为长型数据框可以使用reshape2包中的melt函数



对于长型数据框转化为宽型数据框可以使用stats包中的reshape函数。

reshape函数需要至少5个参数个参数为被重塑的数据框,第二个参数通过v.names指定非分组变量或观测值,第三个参数timevar指定分组变量或因子,第四个参数idvar指定重复出现的观测单位,后一个参数direction指定转换的类型,其值为'wide'和'long'两种。当然可能用到drop参数,指定不需要的观测值变量。



再举一个例子,现在是两个观测变量x和y,将长型数据框变为宽型数据框



发现这样的宽型数据框的列x和y是交错重复出现的,为了x和y分开存放,可以结合一下melt和cast函数


注意这里派生列的名称是按公式中右边变量输入的顺序建立的

数据框的合并

普通情况下一般重用的有rbind函数、cbind函数和merge函数。这里重点介绍一下plyr包中的join函数,该函数在合并数据框时非常的方便,类似于数据库语言中的表连接。

语法:

join(x, y, by = NULL, type = "left", match = "all")

其中x和y是被要合并的数据框;by为x和y中的连接字段;type为合并类型,有左连、右连、内连和全连四种;match用来数据合并过程中重复值的处理,默认情况下不排除重复值,当指定first时,则保留重复值中的个。

下面首先建立两个数据框。



接下来看一看join函数是如何合并数据框的。

左连和右连:



内连和全连



其实这里的join函数,跟数据库中的表连接是一个意思。

以上是对数据框的常见操作,后再对用到的R包和函数做一个总结:

stats包

with()

within()

transform()

subset()

reshape()

rbind()

cbind()

merge()

car包

recode()

reshape包

melt()

cast()

plyr包

rename()

join()

相关文章