R语言实战4:基本数据管理

Python017

R语言实战4:基本数据管理,第1张

title: "R数据实战4:基本数据管理"

author: "wintryheart"

date: "2019年5月17日"

output:

html_document:

toc: TRUE

算术表达式

逻辑表达式

fix(leadship)

rename( dataframe, c(oldname1="newname1", oldname2="newname2", ... ) )

is.na()检测缺失值是否存在。

日期格式

类型转换函数

myvars <- c("q1","q2","q3","q4","q5")

或者

myvars <- paste("q", 1:5, sep="")

newdatas <- leadship[myvars]

使用逻辑判断

newdatas <- leadship[1:3, ]

attach(leadship)

newdats <- leadship[gender == "M" &age>30]

detach(leadship)

R语言数据集行列互换技巧

现在给大家介绍的数据处理技巧是长转宽,也就相当于Excel中的转置,不过用R语言实现的长转宽还有数据合并的功能,自然比Excel强大多了。

这里给大家介绍4个函数,其中melt()、dcast()来自reshape2包,gather()、spread()来自tidyr包

一、宽转长——melt()、gather()

[python] view plain copy

mydata<-data.frame(

name=c("store1","store2","store3","store4"),

address=c("普陀区","黄浦区","徐汇区","浦东新区"),

sale2014=c(3000,2500,2100,1000),

sale2015=c(3020,2800,3900,2000),

sale2016=c(5150,3600,2700,2500),

sale2017=c(4450,4100,4000,3200)

)

#宽转长——melt

mydata1<-melt(

mydata,

id.vars=c("address","name"),#要保留的主字段

variable.name = "Year",#转换后的分类字段名称(维度)

value.name = "Sale" #转换后的度量值名称

)

输出结果

[python] view plain copy

>mydata1<-melt(

+ mydata,

+ id.vars=c("address","name"),#要保留的主字段

+ variable.name = "Year",#转换后的分类字段名称(维度)

+ value.name = "Sale" #转换后的度量值名称

+ )

>mydata1

address name Year Sale

1普陀区 store1 sale2014 3000

2黄浦区 store2 sale2014 2500

3徐汇区 store3 sale2014 2100

4 浦东新区 store4 sale2014 1000

5普陀区 store1 sale2015 3020

6黄浦区 store2 sale2015 2800

7徐汇区 store3 sale2015 3900

8 浦东新区 store4 sale2015 2000

9普陀区 store1 sale2016 5150

10 黄浦区 store2 sale2016 3600

11 徐汇区 store3 sale2016 2700

12 浦东新区 store4 sale2016 2500

13 普陀区 store1 sale2017 4450

14 黄浦区 store2 sale2017 4100

15 徐汇区 store3 sale2017 4000

16 浦东新区 store4 sale2017 3200

再来看看gather()函数怎么用

[python] view plain copy

>#宽转长——gather

>mydata1<-tidyr::gather(

+ data=mydata,

+ key="Year",

+ value="sale",

+ sale2014:sale2017

+ )

>mydata1

name address Year sale

1 store1 普陀区 sale2014 3000

2 store2 黄浦区 sale2014 2500

3 store3 徐汇区 sale2014 2100

4 store4 浦东新区 sale2014 1000

5 store1 普陀区 sale2015 3020

6 store2 黄浦区 sale2015 2800

7 store3 徐汇区 sale2015 3900

8 store4 浦东新区 sale2015 2000

9 store1 普陀区 sale2016 5150

10 store2 黄浦区 sale2016 3600

11 store3 徐汇区 sale2016 2700

12 store4 浦东新区 sale2016 2500

13 store1 普陀区 sale2017 4450

14 store2 黄浦区 sale2017 4100

15 store3 徐汇区 sale2017 4000

16 store4 浦东新区 sale2017 3200

和melt()函数不同,gather()函数需要指定关键字段key,以及关键字段对应的值value,但是gather()函数更加好理解。

二、长转宽——dcast()和spread()

还是用上面的data1数据集,先来看看dcast()函数

[python] view plain copy

#长转宽——dcast

dcast(

data=mydata1,

name+address~Year

#左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式

#右侧分类变量的类别个数

)

[python] view plain copy

>#长转宽——dcast

>dcast(

+ data=mydata1,

+ name+address~Year

+ #左侧是要保留的字段,右侧是要分割的分类变量,列数等于表达式

+ #右侧分类变量的类别个数

+ )

Using sale as value column: use value.var to override.

name address sale2014 sale2015 sale2016 sale2017

1 store1 普陀区 3000 3020 5150 4450

2 store2 黄浦区 2500 2800 3600 4100

3 store3 徐汇区 2100 3900 2700 4000

4 store4 浦东新区 1000 2000 2500 3200

dcast()函数的使用规则需要琢磨下才能理解,大家好好看看注释部分,再来看看spread()

[python] view plain copy

#长转宽——spread

tidyr::spread(

data=mydata1,

key=Year,

value=sale

)

[python] view plain copy

>#长转宽——spread

>tidyr::spread(

+ data=mydata1,

+ key=Year,

+ value=sale

+ )

name address sale2014 sale2015 sale2016 sale2017

1 store1 普陀区 3000 3020 5150 4450

2 store2 黄浦区 2500 2800 3600 4100

3 store3 徐汇区 2100 3900 2700 4000

4 store4 浦东新区 1000 2000 2500 3200

直接调用tidyr::spread,需要指定关键字段key和对应的值value。

但是从理解上来看,我个人更喜欢tidyr包的函数,使用很清晰,大家可以根据实际情况自行选择,好啦,今天的分享结束,下次再见!

这里分享一下R语言实现VAR和SVAR的整个流程。

主要步骤包括:

1.单位根检验

2.确定滞后阶数

3.格兰杰因果检验

4.模型稳定性检验

5.脉冲响应

6.方差分解

(Johansen协整检验,如果需要的话)

整个过程用到的R语言的扩展包有:

library(zoo)

library(vars)

library(tseries)

首先,数据是下面的样子:

ps:数据是时间序列类型,可以通过下面方法将dataframe转成时间序列类型

data = ts(data)

1.单位根检验

#对data的第一列进行单位根检验

adf.test(data[,1])

2.滞后阶数确定

VARselect函数结果包括AIC、HQ、SC和FPE准则

#参数y为时间序列数据,lag.max为最大滞后阶数

#参数type值包括const截距,trend趋势,both同时包含截距和趋势,none不包含截距和趋势

VARselect(y=data, lag.max = 10, type = c("const"))

3.格兰杰因果检验

格兰杰因果检验有两个方法,第一个是在构造模型之前,第二个是在构造模型之后在模型的基础上进行格兰杰因果检验。

(1)构造模型之前格兰杰因果检验

#函数格式:grangertest(yt~xt)

eg:

grangertest(Value~BCI)

(2)构造模型之后格兰杰因果检验

#函数格式:causality(VARModel,cause)

eg

var =  VAR(data ,p = 2, type = "const")

causality(var,cause=c('Count','Value'))

ps:在这里如果想要构建SVAR模型的话,需要根据实际情况构建两个矩阵amat和bmat,然后使用这两个矩阵来构建SVAR模型:

svar = SVAR(var,Amat = amat,Bmat = bmat)

4.模型稳定性检验

#这里使用“OLS-CUSUM”,它给出的是残差累积和,在该检验生成的曲线图中,残差累积和曲线以时间为横坐标,

#图中绘出两条临界线,如果累积和超出了这两条临界线,则说明参数不具有稳定性。

sta = stability(var, type = c("OLS-CUSUM"), h = 0.15, dynamic = FALSE, rescale = TRUE)

plot(sta)##结果稳健

5.脉冲响应

#标题栏说明,这是BCI(或者其他变量)对各个变量(包括BCI自身)的脉冲响应

(1)VAR脉冲响应

var.irf<-irf(var,n.head=10)

plot(var.irf)

(2)SVAR脉冲响应

svar.irf<-irf(svar,n.ahead = 100)

plot(svar.irf)

6.方差分解

#反映了各变量的贡献率

(1)VAR方差分解

fevd1<-fevd(var, n.ahead = 10)

fevd1$Count

(2)SVAR方差分解

fevd2<-fevd(svar, n.ahead = 10)

fevd2$Value

ps:有时候需要进行Johansen协整检验

#Johansen协整检验,

#对r=0(不存在协整关系)的检验统计量大于临界值,表明拒绝原假设

yJoTest = ca.jo(data, type = c("trace"), ecdet = c("none"), K = 2)

summary(yJoTest)

网页链接