R语言之数据重塑

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

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


方法一:使用一个$符

0?wx_fmt=png


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

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

0?wx_fmt=png


方法三:transform函数

0?wx_fmt=png


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

0?wx_fmt=png


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

0?wx_fmt=png


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

0?wx_fmt=png

实际上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为长型

0?wx_fmt=png


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

0?wx_fmt=png


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

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

0?wx_fmt=png


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

0?wx_fmt=png

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

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


数据框的合并

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

语法:

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

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


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

0?wx_fmt=png

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

左连和右连:

0?wx_fmt=png

内连和全连

0?wx_fmt=png

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


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

stats包

with()

within()

transform()

subset()

reshape()

rbind()

cbind()

merge()

car包

recode()

reshape包

melt()

cast()

plyr包

rename()

join()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值