[原]数据科学教程:R语言与NoSQL
介绍
现代化数据科学中的 DataFrame 概念源起R语言,而 Python Pandas 和 Spark DateFrame 都是参考R设计的。不过在实际的网络数据通讯中,类似DateFrame这样的格式却并不是主流,真正主流的方式其实是JSON(JavaScript Object Notation),所以讨论如何处理非结构化数据就变得非常有意义了。加之,近年来 Redis、MongoDB、ELK等非结构化数据库的繁荣,MySQL 5.7之后也已经添加了对JSON格式的原生支持(之前可以用blob、longtext等格式存储),非结构化数据更是在数据处理中变得流行。
本文将从 非结构化数据的转化、处理以及可视化三个方面讨论如何在R中操作非结构化数据。
数据清洗:JSON、List、DataFrame的三国杀
DataFrame 是R中的结构化数据结构,List 是R中的非结构化数据。JSON、List、DataFrame三者之间的互相转化是数据科学中非常频繁的一类操作。
在R中有一个非常有意思的现象,那就是处理json时,我们有三个选择,jsonlite、rjson以及RJSONIO,三者各有特点,有时为了处理一些问题还必须得混合使用。在实际处理字符串中,一定要注意的就是R中字符串的转义问题。比如\\
表示\
,\"
表示"
等等。我曾经因为Python和R中的双层JSON解析多次遇到转义符号的问题。具体可以参看官方手册。
jsonlite
jsonlite 是我最常用的一个json处理包,因为jsonlite可以一步将 json 转成 dataframe 再 从dataframe 转到 json,在数据处理中可以轻松解决常见的 json转化问题。此外,jsonlite 还完美支持utf-8,在 json 字符串错误时会有明显的错误提示。
jsonlite 的劣势是当出现双层 json 时,jsonlite 会将json转成dataframe格式的 list,这直接导致我们在用 length() 或者 dim() 求内层 JSON 的维度会出现错误。
jsonlite::fromJSON("{\"x\":\"量化投资\",\"y\":\"harryzhu\"}")
$x
[1] "量化投资"$y
[1] "harryzhu"
rjson
rjson 和 jsonlite最大不同之处在于,rjson将json转化为一个list,而list是R语言中非结构化数据的事实标准,类似 python 中的 dict,或者 matlab 中的 cell。
值得注意的是,rjson在json转化中直接保持所有的浮点型数据,而jsonlite和RJSONIO则可以通过参数控制保留若干位小数的精度。
rjson::fromJSON("{\"x\":\"1\",\"y\":\"2\"}")
rjson::toJSON(pi)
$x
[1] "1"$y
[1] 2[1] "3.14159265358979"
jsonlite::fromJSON(pi,digit=4)
[1] "[ 3.142 ]"
RJSONIO
RJSONIO 允许传入没有转义符号的 JSON 字符串,并且支持将缺失值(NA)直接转成 Null,需要小心的是RJSONIO只支持unicode,如果传入utf-8则会酿成悲剧。
RJSONIO::fromJSON(RJSONIO::toJSON(c(1,2,NA,4)))
"[[1]]
[1] 1[[2]]
[1] 2[[3]]
NULL[[4]]
[1] 4"
更多细节可以参考 A biased comparsion of JSON packages in R
数据处理:List 处理
谈到list的处理就不得不谈一谈 rlist包。rlist包是任坤老师贡献到CRAN上的,任坤老师既是一个多产的R Developer (pipeR、formattable作者)也是一名量化投资者,目前在做私募方面的创业。想要学习rlist,我们可以参考一下任坤老师的演讲:跳出数据框,拥抱非结构化数据和官方教程。
rlist与高阶函数
rlist 是支持高阶函数表达式的,借鉴了Python、Scala等语言中的MapReduce模型,rlist也为list提供了map、filter、reduce、group、join、search、sort等高级数据操作,熟悉这些操作以后上手sparkR的RDD操作非常有帮助。
示例一:
利用 GitHub API,我们可以知道Hadley 的原创R语言开源项目中讨论议题数量最多的10个项目是哪些。
library(rlist)
library(pipeR)
# 分页读取数据
repos <-
"https://api.github.com/users/hadley/repos?per_page=100&page=%d" %>>%
sprintf(1:2) %>>%
list.load("json") %>>%
list.ungrouprepos %>>%
list.filter(has_issues, !fork, language == "R") %>>%
list.names(name) %>>%
list.mapv(open_issues) %>>%
list.sort(-.) %>>%
list.take(10)
# dplyr ggplot2 lubridate devtools staticdocs plyr
# 88 72 54 33 32 28
# stringr roxygen3 scales gtable
# 24 22 22 21
示例二:
批量读取非空 csv 文件并且合并成一个 data frame:
"data/" %>>%
list.files("\\.csv", full.names = TRUE) %>>%
list.filter(file.info(.)$size > 0) %>>%
list.map(read.csv(., header = TRUE, stringsAsFactors = FALSE)) %>>%
list.stack
rlist扩展包充分利用了R语言中list对象的特性,定义了一整套函数来帮助用户灵活快速地按要求处理各种非结构化数据,同时结合pipeR包中管道操作符的使用,使R程序更加具有可读性,应用更加人性化。
更多操作
下面是rlist中提供的操作:
分类 | 函数 |
---|---|
映射(Mapping) | list.map, list.mapv, list.select, list.iter, list.maps |
筛选(Filtering) | list.filter, list.find, list.findi, list.first, list.last,list.take, list.skip,list.takeWhile, list.skipWhile, list.is,list.which, list.all, list.any, list.count, list.match |
更新(Updating) | list.update |
排序(Sorting) | list.order, list.sort |
分组(Grouping) | list.group, list.ungroup, list.cases, list.class, list.common,list.table |
合并(Joining) | list.join, list.merge |
搜索(Searching) | list.search |
数据读写(I/O) | list.parse, list.load, list.save, list.serialize,list.unserialize |
数据变换 | list.append, list.prepend, list.reverse, list.zip, list.rbind,list.cbind, list.stack, list.flatten, list.names, list.sample |
非结构化数据可视化
为了方便在R中可视化JSON数据,jsonview将js中的jsonviewer库引入到R中。
我们可以传入list或者json字符串做非结构化数据的可视化。
library(xmlview)
library(jsonlite)
devtools::install_github("hrbrmstr/jsonview")
jsonview::json_tree_view(fromJSON("https://collector.torproject.org/index.json"))
下面是timelyportfolio提供的一个结合shiny和jsonview的json编辑器的例子:
install.packages("shiny")
devtools::install_github("timelyportfolio/listviewer")
library(shiny)
library(listviewer)# 数据准备
data(mtcars)ui <- shinyUI(fluidPage(jsoneditOutput( "jsed" ))
)server <- function(input,output){output$jsed <- renderJsonedit({jsonedit(as.list( .GlobalEnv ),"change" = htmlwidgets::JS('function(){console.log( event.currentTarget.parentNode.editor.get() )}'))})
}runApp( list( ui = ui, server = server ) )
接着,在浏览器中的对应端口可以打开这个json编辑器应用。
尾注
除了JSON之外,和NoSQL数据库的交互在大数据时代也成为了主流,混合使用Redis、Hive、MongoDB等数据库也成了家常便饭,具体操作可以翻看张丹老师的R利剑NoSQL系列文章。
参考资料
- A biased comparsion of JSON packages in R
- 任坤:跳出数据框,拥抱非结构化数据
- rlist-tutorial
- jsonview GitHub
- hrbrmstr/jsonview
作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR 专栏: https://segmentfault.com/blog...,如果涉及源代码请注明GitHub地址: https://github.com/harryprince。微信号: harryzhustudio
商业使用请联系作者。
[原]数据科学教程:R语言与NoSQL相关推荐
- 《数据科学:R语言实现》——2.7 爬取网络数据
本节书摘来自华章计算机<数据科学:R语言实现>一书中的第2章,第2.7节,作者 丘祐玮(David Chiu),更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...
- 《数据科学:R语言实现》——3.9 排列数据
本节书摘来自华章计算机<数据科学:R语言实现>一书中的第3章,第3.9节,作者 丘祐玮(David Chiu),更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...
- 《数据科学:R语言实现》——3.12 估计缺失数据
本节书摘来自华章出版社<数据科学:R语言实现>一 书中的第3章,第3.12节,作者:R for Data Science Cookbook 丘祐玮(David Chiu),更多章节内容可以 ...
- 《数据科学:R语言实现》——2.5 使用Excel文件
本节书摘来自华章计算机<数据科学:R语言实现>一书中的第2章,第2.5节,作者 丘祐玮(David Chiu),更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...
- 《数据科学:R语言实现》——第1章 R中的函数
本节书摘来自华章出版社<数据科学:R语言实现>一 书中的第1章,第1.1节,作者:R for Data Science Cookbook 丘祐玮(David Chiu),更多章节内容可以访 ...
- 数据科学与R语言: 关于我 Rer
数据科学与R语言: 关于我 Rer 数据科学与R语言: 关于我 关于我 钱钟书曾说,鸡蛋好吃不一定要去认识下蛋的母鸡.不过人类是社会化的动物,访客和博主都希望有多一些的交流.在2012年元旦之即,写下 ...
- 【R 数据科学】R语言进行数据科学整理最有用的包大全
一.数据科学工作流程 1.1 数据导入 1.2 数据整理 1.3 反复理解数据 1.4 数据可视化 1.5 数据转换 1.6 统计建模 1.7 作出推断(比如预测) 1.8 沟通交流 1.9 自动化分 ...
- R plot图片背景设置为透明_数据科学06 | R语言程序设计模拟和R分析器
模拟simulation ➢概率函数 概率函数通常用来生成特征已知的模拟数据,以及在统计函数中计算概率值. 对于任意分布有四种基本函数: 前缀 作用 d 产生随机数 r 估计概率分布的密度 p 估计累 ...
- H G W S哪一个不是状态函数_数据科学05 | R语言程序设计调试工具与str函数
调试工具debugging tools ➢条件condition 用于提示运行函数过程中意外事件或错误的发生,编写函数时可以自行创造新的提示条件. message:由message()产生,输出提示信 ...
最新文章
- html2canvas在Vue项目踩坑-生成图片偏移不完整
- 【Anaconda】InvalidVersionSpecError: Invalid version spec: =2.7
- 小程序 、h5图片铺满div,自适应容器大小
- 抓取一台电脑linux,教程方法;用来获取Linux主机信息的5个常用命令电脑技巧-琪琪词资源网...
- Python--网络编程-----传输层tcp/udp协议
- 2018-2019-2 网络对抗技术 20165334 Exp7 网络欺诈防范
- 如何保护 IT 基础设施的安全?谷歌给出了500页的答案
- python模板怎么写,Python模板
- libcurl学习及简易封装类
- 微信自动选择浏览器打开方式
- 历年计算机考研复试_重点面试题
- IDEA eclipse快捷键大全
- 计算机网络中数据传输速率的单位是什么,计算机网络中传输介质传输速率的单位是用什么表示...
- 数据分析之MySQL(十二)账户管理
- ACP报名考试有学历限制吗?
- cad.net 依照旧样条曲线数据生成一条新样条曲线的代码段. spline生成
- 富文本样式文字图片处理
- 有着奋斗比之都之称的杭州,现在还适不适合年轻人奋斗?
- React报错Warning: This synthetic event is reused for performance reasons. If you‘re seeing this, 解决方法
- 手机游戏开发培训: 手机游戏开发培训渐入成熟 、技术培训打造IT金领
热门文章
- ChatGPT角色扮演咒语库(内有插件推荐)
- 2018最新最全的设计模式视频教程免费下载
- 关于操作系统中的作业(Job)概念
- 64位rhel4 u6上安装oracle 10g rac,在64位RHEL4 U6上安装Oracle 10g RAC
- 用python写一个密码生成器函数
- 互联网早报:前程无忧将上线“简历下载水印”等功能,可显示简历流向路径
- 宏录制流程-制作工资条
- 做头像软件测试,用自己照片当微信头像的人,都是什么样的人?
- 什么是可信云?通过可信云评估意味着什么?
- 深度学习必备书籍——《Python深度学习 基于Pytorch》