[原]数据流编程教程:R语言与非结构化数据共舞

介绍现代化数据科学中的 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解析多次遇到转义符号的问题。具体可以参看官方手册。
jsonlitejsonlite 是我最常用的一个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"rjsonrjson 和 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 ]"RJSONIORJSONIO 允许传入没有转义符号的 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的处理就不得不谈一谈 A biased comparsion of JSON packages in R
任坤:跳出数据框,拥抱非结构化数据
rlist-tutorial
jsonview GitHub
作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR 专栏:https://segmentfault.com/blog/harryprince,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio
商业使用请联系作者。

转载地址:https://segmentfault.com/a/1190000004592610