全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析师(CDA)专版
1769 0
2016-04-06

[原]数据流编程教程: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解析多次遇到转义符号的问题。具体可以参看官方手册

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的处理就不得不谈一谈 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


  • 二维码

    扫码加我 拉你入群

    请注明:姓名-公司-职位

    以便审核进群资格,未注明则拒绝

    相关推荐
    栏目导航
    热门文章
    推荐文章

    分享

    扫码加好友,拉您进群
    各岗位、行业、专业交流群