[R语言] 10行代码展示我国35个主要城市近一年来居民消费价格指数的变化

前言

  • 近年来,随着我国GDP呈现逐年增长的趋势,居民消费价格指数CPI也开始受到更多人的讨论,国家经济的发展,究竟是提高了居民的生活水平呢,还是增加了居民的生活压力呢?
  • 接下来就让我们通过10行代码,直接从国家统计局(National Bureau of Statics of China,简称nbsc)获取数据,展示我国35个主要城市近一年来居民消费价格指数的变化。快来看看你所在的城市物价有没有上涨吧。

nbsc网站

nbsc官网


加载所需程序包

  • 以下三行代码加载了我们需要用到的三个程序包——发送网页请求的RCurl、解析json文本的rjson、绘图用的ggplot2。作为代码开始的文件头,下面三行就不算在10行代码内了。
library(RCurl)
library(rjson)
library(ggplot2)


从nbsc获取数据

  • 首先,我们仅使用了一行代码就从nbsc获取到了想要的数据。至于函数中一长串url字符是如何来的,其实也很简单,只要懂一些网络基础知识,分析这些并不难。而且只要你掌握了其中的规律,其实只需要修改几个字符,就可以获取nbsc中的任意一张报表。
mjson <- getURL('http://data.stats.gov.cn/easyquery.htm?m=QueryData&dbcode=csyd&rowcode=reg&colcode=sj&wds=[{"wdcode":"zb","valuecode":"A010301"}]&dfwds=[{"wdcode":"sj","valuecode":"LAST13"}]', .encoding = "utf-8")


解析json文本

  • 虽然我们已经获取了想要的数据,但目前数据是以json文本的形式存储的,我们需要对其做一下转换,才能更有效的使用。
# 将获取到的json文本转换为list(列表)类型的数据
mlist <- fromJSON(mjson)


数据梳理

  • 接下来我们需要对数据做进一步的梳理,解析list类型的数据mlist,获取我们想要的表格标题、数据说明、行名、列名、数据。
# 获取表格标题
title <- mlist$returndata$wdnodes[[1]]$nodes[[1]]$name
# 获取nbsc对此数据表的说明
description <- mlist$returndata$wdnodes[[1]]$nodes[[1]]$memo
# 获取行名、列名、数据
rnames <- sapply(mlist$returndata$wdnodes[[2]]$nodes,function(x)x$cname)
cnames <- sapply(mlist$returndata$wdnodes[[3]]$nodes,function(x)x$cname)
values <- sapply(mlist$returndata$datanodes,function(x)x$data$data)


数据转换 version 1

  • 接下来我们需要将rnames、cnames、values三个向量进行合并,拼成我们在nbsc中看到的数据表的样子。

nbsc中的报表样式

nbsc中的报表样式


  • 为了方便绘图,我们还需要将宽型的数据表转换为长型的数据表,使rnames为一列(城市),cnames为一列(日期),values为一列。你也可以自己用R语言查看这两种数据格式的差异。这里我们使用了R语言自带的reshape函数,当然如果使用reshape等程序包的话,工作会简单的多。
宽型数据
长型数据
宽型数据 长型数据
  • 当然如果这样写代码,肯定不能在10行内完成我们的工作,所以我们会使用更简洁的方式,以下三行就不算在10行代码内了。
# 将行名、列名、取值整理为matrix(数组)类型的数据
mt <- matrix(values, nrow = length(rnames), byrow = T, dimnames = list(rnames,cnames))
# 将数组转化为data.frame类型的数据,类似于一张excel表格
mdf <- as.data.frame(mt)
# 将宽型数据转为长型数据
mdf <- reshape(mdf, ids = rownames(mdf), times = colnames(mdf), varying = colnames(mdf), idvar = "city", timevar = "date", v.names = "value", direction = "long")


数据转换 version 2

  • 这里我们用了一种更简洁的方式,直接将rnames、cnames、values合并成了一份长型的数据表,不过首先你需要明白values是按行排列的,所以这里的city字段需要将rnames中的每个元素做一下重复。
# 将rnames、cnames、values三个数组合并为data.frame类型的数据
mdf <- data.frame(city = rep(rnames, each = length(cnames)), date = cnames, value = values)


数据筛选

  • 或许你已经发现了有些城市的取值总是0,主要是因为这些城市的居民消费价格指数并没有被统计上去,所以这里我们需要对数据进行一下简单的筛选,将取值为0的行全部删除。这里用到了R语言自带的subset函数,
  • 当然如果你需要处理大量数据筛选、合并、汇总的工作,tibble + tidyr + dplyr效率会更高一点。
# 去除数据表中取值为0的行
mdf <- subset(mdf,value > 0)


图形化展示数据

  • 最后我们通过一行代码,将数据表图形化的展示了出来。为了调节图形布局,这行代码显得有点长,但相比用ggplot2绘制的可出版图形,这些根本不算什么。
  • 当然你也可以使用更高级的作图工具,比如ggplotly,recharts,以及专门绘制时序图的dygraphs等,将图形更加完美的呈现出来。
# 使用ggplot2作图
ggplot(mdf, aes(date, value, group = city, color = city)) + geom_line() + labs(x = "日期", y = "同比上月跌涨幅(%)", title = title, subtitle = description) + ylim(98,NA) + theme(legend.title = element_blank(), legend.position = "left", axis.text.x = element_text(angle = 30, hjust = 1))

展示结果

最终展示结果


结语

  • 至此,我们10行代码展示我国35个主要城市近一年来居民消费价格指数变化的工作总算完成了。大家如果有好的意见或建议,欢迎给我留言。



猜你喜欢

转载自blog.csdn.net/weixin_38641983/article/details/80814921
今日推荐