如何用R语言从网上读取多样格式数据

第一部分:数据信息

生活中,我们面临着各种各样的数据:比如你的成绩单,比如公司的财务报表,比如朋友圈的一些状态,比如微信里的一段语音……我们生活的大数据时代的一个重要特征便是数据的多样化(variety)。 也许你期待的数据是这样的:

##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa

然而事实上我们面临的数据确实这样的:

@HWI-EAS121:4:100:1783:550#0/1
CGTTACGAGATCGGAAGAGCGGTTCAGCAGGAATGCCGAGACGGATCTCGTATGCGGTCTGCTGCGTGACAAGACAGGGG
+HWI-EAS121:4:100:1783:550#0/1
aaaaa`b_aa`aa`YaX]aZ`aZM^Z]YRa]YSG[[ZREQLHESDHNDDHNMEEDDMPENITKFLFEEDDDHEJQMEDDD
@HWI-EAS121:4:100:1783:1611#0/1
GGGTGGGCATTTCCACTCGCAGTATGGGTTGCCGCACGACAGGCAGCGGTCAGCCTGCGCTTTGGCCTGGCCTTCGGAAA
+HWI-EAS121:4:100:1783:1611#0/1
a``^\__`_```^a``a`^a_^__]a_]\]`a______`_^^`]X]_]XTV_\]]NX_XVX]]_TTTTG[VTHPN]VFDZ
@HWI-EAS121:4:100:1783:322#0/1
CGTTTATGTTTTTGAATATGTCTTATCTTAACGGTTATATTTTAGATGTTGGTCTTATTCTAACGGTCATATATTTTCTA

还有这样的:

{
    "uid": 10438,
    "result": [
        {
            "day": "2011-12-12",
            "followers_count": "63",   //粉丝数
            "v_followers_count": "18", //V粉丝数
            "daren_followers_count": "18", //达人粉丝数
            "friends_count": "58",    //关注数
            "v_friends_count": "58",  //V关注数
            "statuses_count": "258",   //微博数
            "bi_followers_count": "18",  //互粉数
            "repost_count": "115", //转发数
            "comments_count": "178",   //评论数
        },
        ...
    ]
}

那么我们如何去处理这些数据,我们如何分析这些数据,从数据中找到我们想要的东西呢?我们将从如何将这些数据导入R中开始,慢慢学习如何处理,分析我们身边的大数据。

第一章 数据的导入

面对各种各样纷杂的数据,我们分析的第一步便是获取数据并将其导入R中。

从网上获取数据

大数据的一个重要数据源便是互联网。从网络上获取数据并用来分析是非常重要的。为了得到这些数据,一个普通青年的做法便是来到一个网站,找到数据连接,然后右键->目标另存为,最后从本地文件夹中导入R。但是如果要下载的数据文件数目比较多,再这么做就从一个普通青年降级为了二逼青年。

为了应对需要下载多个文件的情况,R提供了函数download.file(),使得R可以从互联网上直接把数据拽下来。其调用格式为:

download.file(url, destfile, method, quiet = FALSE, mode = "w",
              cacheOK = TRUE,
              extra = getOption("download.file.extra"))

主要的参数为:

  • url:文件的所在地址
  • destfile:下载后文件的保存地址,默认为工作目录
  • method: 提供"internal", "wget", "curl" 和 "lynx"四种method,在windows上通常internal就能解决大多数的问题,少数搞不定的如Cygwin, gnuwin32这种的"wget"就可以搞定;windows的二进制文件用“curl”,这个method对于Mac的用户来说是都要设置的;“lynx”主要针对historical interest。
用法举例:获取上市公司资产负债表

比如说我们要获取一系列的上市公司财务数据,我们就要得到他们的资产负债表。当然,如果花钱买wind数据库,一切也就不用操心了。但是如果不在学校,用不了数据库的话,一个可以替代的办法就是从新浪财经里面拽数据:以安信信托(600816) 资产负债表为例,你可以访问新浪财经就能看个明白,还可以下载。我们如果还要其他的股票,我们都可以如法炮制。那么我们通过R用download.file写一个函数来实现输入股票代码,将资产负债表下载到指定目录:

getbalancesheets=function(symbol,file){pre="http://money.finance.sina.com.cn/corp/go.php/vDOWN_BalanceSheet/displaytype/4/stockid/";end="/ctrl/all.phtml";url=paste(pre,symbol,end,sep="");destfile=paste(file,"BalanceSheet_",symbol,".xls",sep="");

download.file(url, destfile);
}

值得注意的是:

  • 凡是以http开头的,放心大胆的使用download.file()
  • 凡是以https开头的,这个函数可能失效
  • 在设置路径时可以通过file.exists来查看文件夹是否存在,如果不存在可以使用dir.create来创建它,避免找不到路径的烦恼。
  • 使用getwd获取当前工作路径,setwd可以改变它

读入XML

XML可以说是我们非常熟悉的一类数据。我们通常在网上看到的电子表格便是XML文件的一部分。我们可以看到XML文件大抵是长这样的.

如何打开这样的一个文件?其实最简单的就是用EXCEL表格打开了,我们只要在打开文件时作为 XML 列表打开文件。当打开 XML 源时,Excel 会查找 XML 样式表 (XSL) 的标记。XSL 说明数据的显示方式。如果存在相应的标记,Excel 将会提示您选择是否应用样式表。如果选择应用 XSL,则 XSL 将指示数据的显示方式。

关于XML这种可扩展性标记语言,我们不再赘述,可以参阅wiki.这里我们关注的是在得到XML文件后如何分析处理。

R提供了XML包供我们来读取这样一个文件。我们将XML包的主要函数介绍如下:

xmlTreeParse(file, ignoreBlanks=TRUE, handlers=NULL, replaceEntities=FALSE,
             asText=FALSE, trim=TRUE, validate=FALSE, getDTD=TRUE,
             isURL=FALSE, asTree = FALSE, addAttributeNamespaces = FALSE,
             useInternalNodes = FALSE, isSchema = FALSE,
             fullNamespaceInfo = FALSE, encoding = character(),
             useDotNames = length(grep("^\\.", names(handlers))) > 0,
             xinclude = TRUE, addFinalizer = TRUE, error = xmlErrorCumulator(),
             isHTML = FALSE, options = integer(), parentFirst = FALSE)

xmlRoot(x, skip = TRUE, ...)
## S3 method for class 'XMLDocumentContent'
xmlRoot(x, skip = TRUE, ...)
## S3 method for class 'XMLInternalDocument'
xmlRoot(x, skip = TRUE, addFinalizer = NA, ...)
## S3 method for class 'HTMLDocument'
xmlRoot(x, skip = TRUE, ...)
  • xmlTreeParse函数主要是用于解析XML或HTML文件包含XML / HTML内容或字符串,并生成一个R代表XML / HTML树结构。
  • xmlRoot函数主要是用于提供方便地访问由解析一个XML文档产生的顶级XMLNode对象.

我们下面就来一步一步的分析如何读取一个XML或者HTML文件:

  • 获取网页数据

这时你需要用到RCurl包的getURL函数来下载相关网页,我们以最近BBC上最火的Robin Williams的一则新闻为例说说怎样读取HTML文件(因为中文有些网站会出现乱码,为了避免不必要的麻烦,我们暂时使用英文网站,稍后的例子会有中文的):

library(RCurl)
library(XML)url <- "http://www.bbc.com/news/entertainment-arts-28761353"SOURCE <-  getURL(url,encoding="UTF-8") #Download the page
## Error: transfer closed with 78288 bytes remaining to read
#this is a very very long line. Let's not print it. Instead:substring (SOURCE,1,200)
## Error: 找不到对象'SOURCE'
PARSED <- htmlParse(SOURCE) #Format the html code d
## Error: 找不到对象'SOURCE'
  • 获取HTML的元素

我们可以通过XPath的相关函数来获取HTML的相关信息:

xpathSApply(PARSED, "//h1")
## Error: 找不到对象'PARSED'

这样的标题由于含有HTML标记,让我们很不爽,我们可以通过下面函数来去掉它:

xpathSApply(PARSED, "//h1",xmlValue)
## Error: 找不到对象'PARSED'

相应的函数调用格式如下:

xpathApply(doc, path, fun, ... ,
            namespaces =  xmlNamespaceDefinitions(doc, simplify = TRUE),
              resolveNamespaces = TRUE, addFinalizer = NA)
xpathSApply(doc, path, fun = NULL, ... ,
             namespaces = xmlNamespaceDefinitions(doc, simplify = TRUE),
               resolveNamespaces = TRUE, simplify = TRUE, addFinalizer = NA)

主要参数:

  • doc:XMLInternalDocument类型的数据,htmlParse函数产生的对象
  • path:XPath 表达式,常用的有 "/" 表示根节点处寻找;"//"表示文档任意处寻找;"@"表示选择相应的属性

我们可以通过抓取HTML里的关键词来发现很多东西,比如我们想知道这个页面有多少条链接,我们只需要运行:

length(xpathSApply(PARSED, "//a/@href"))

再比如我们想要知道新闻的日期,我们可以运行:

xpathSApply(PARSED, "//span[@class='date']",xmlValue)

最后要说的是,你的挖掘一定要对HTML的结构十分的熟悉,比如页面有哪些元素,这是第几级的结构等,方便在使用@时确定能找到有关属性,比如说我想知道BBC报道了哪些最近的关于中国的新闻,我们就可以运行以下代码:

url="http://www.bbc.co.uk/search/news/?q=China&search_form=in-page-search-form"SOURCE <-  getURL(url,encoding="UTF-8")PARSED <- htmlParse(SOURCE)targets <- unique(xpathSApply(PARSED, "//a[@class='title linktrack-title']/@href"))
head(targets)
## [1] "http://www.bbc.co.uk/news/world-europe-28755656"       
## [2] "http://www.bbc.co.uk/news/business-28767854"           
## [3] "http://www.bbc.co.uk/news/blogs-echochambers-28747713" 
## [4] "http://www.bbc.co.uk/news/uk-scotland-22207042"        
## [5] "http://www.bbc.co.uk/news/in-pictures-28743753"        
## [6] "http://www.bbc.co.uk/news/science-environment-28744469"

然而,对于上面那篇文章,"//a[@class='title linktrack-title']/@href"是找不到任何东西的。进一步地,对于每一个链接,如果我们还想知道标题与日期,我们可以使用sapply函数:

bbcScraper2 <- function(url){  title=date=NA #Return empty values in case field not found
  SOURCE <-  getURL(url,encoding="UTF-8") 
  PARSED <- htmlParse(SOURCE)  title=(xpathSApply(PARSED, "//h1[@class='story-header']",xmlValue))  date=(xpathSApply(PARSED, "//meta[@name='OriginalPublicationDate']/@content"))  if (is.null(date)){    date=(xpathSApply(PARSED, "//span[@class='date']",xmlValue))
  }  return(c(title,as.character(date)))
}targets<-as.data.frame(targets)
t(sapply(targets[1:5,],bbcScraper2))
##      [,1]                                                 
## [1,] "Pope Francis faces greatest challenge yet in Asia"  
## [2,] "Alibaba sells off loan business ahead of share sale"
## [3,] "Conservatives misguided after Ferguson shooting"    
## [4,] "Q&A: Edinburgh's giant pandas"                      
## [5,] "In pictures: Framing Hope"                          
##      [,2]                 
## [1,] "2014/08/13 01:51:58"
## [2,] "2014/08/13 01:18:39"
## [3,] "2014/08/12 17:05:25"
## [4,] "2014/08/12 16:00:21"
## [5,] "2014/08/12 14:55:21"
  • 读取网页表格

很多网站并不提供直接的数据下载,而是提供一个网页表格供你在线观看。那么我们有没有简单一点的办法把他们拽下来呢?readHTMLTable函数可以帮我们把东西轻而易举的办到,我们先来看看函数的调用格式:

readHTMLTable(doc, header = NA,
              colClasses = NULL, skip.rows = integer(), trim = TRUE,
              elFun = xmlValue, as.data.frame = TRUE, which = integer(),
               ...)

我们以保利地产的分红情况为例来说明函数的使用:

url<-"http://money.finance.sina.com.cn/corp/go.php/vISSUE_ShareBonus/stockid/600048.phtml"data<-readHTMLTable(url,header=NA, which=19)data
##           V1 V2 V3   V4     V5         V6         V7         V8     V9
## 1 2014-05-16  0  5 2.94 瀹炴柦 2014-05-22 2014-05-21         -- 鏌ョ湅
## 2 2013-05-28  0  0 2.32 瀹炴柦 2013-06-03 2013-05-31         -- 鏌ョ湅
## 3 2012-06-12  0  2 2.15 瀹炴柦 2012-06-18 2012-06-15         -- 鏌ョ湅
## 4 2011-05-11  0  3 2.13 瀹炴柦 2011-05-17 2011-05-16         -- 鏌ョ湅
## 5 2010-04-21  0  3    1 瀹炴柦 2010-04-27 2010-04-26         -- 鏌ョ湅
## 6 2009-04-24  3  0 1.32 瀹炴柦 2009-04-30 2009-04-29         -- 鏌ョ湅
## 7 2008-03-05  0 10  0.7 瀹炴柦 2008-03-11 2008-03-10 2008-03-12 鏌ョ湅
## 8 2007-03-27  0 10  0.3 瀹炴柦 2007-04-02 2007-03-30 2007-04-03 鏌ョ湅

对于中文来说,出现了乱码,这是我们不希望看到的,一个简单地办法就是将文件写入一个txt文件,再重新读取出来,即:

write.table(data,"F:/table.txt")
read.table("F:/table.txt",encoding = "UTF-8")
##           V1 V2 V3   V4   V5         V6         V7         V8   V9
## 1 2014-05-16  0  5 2.94 实施 2014-05-22 2014-05-21         -- 查看
## 2 2013-05-28  0  0 2.32 实施 2013-06-03 2013-05-31         -- 查看
## 3 2012-06-12  0  2 2.15 实施 2012-06-18 2012-06-15         -- 查看
## 4 2011-05-11  0  3 2.13 实施 2011-05-17 2011-05-16         -- 查看
## 5 2010-04-21  0  3 1.00 实施 2010-04-27 2010-04-26         -- 查看
## 6 2009-04-24  3  0 1.32 实施 2009-04-30 2009-04-29         -- 查看
## 7 2008-03-05  0 10 0.70 实施 2008-03-11 2008-03-10 2008-03-12 查看
## 8 2007-03-27  0 10 0.30 实施 2007-04-02 2007-03-30 2007-04-03 查看

看表格很完整的展现在我们面前了。

应用举例:中超预测

虽然中国足球没什么看点,但是还是有一些槽点,对于买彩票的如果没有假球的话还有一些竞猜的价值。我们想要推断首先就得从网上获取相应数据,我们还是用简单的readHTMLTable函数从网易载入中超赛程数据:

library(XML)CslData <- readHTMLTable("http://cs.sports.163.com/fixture/", header = T)CslPoint <- CslData[[31]]CslData[[31]] <- NULLCslFixture <- do.call(rbind, lapply(CslData, function(x) subset(x[, 3:5])))
colnames(CslFixture) <- iconv(colnames(CslFixture), "UTF-8")
colnames(CslPoint) <- iconv(colnames(CslPoint), "UTF-8")
head(CslFixture)
##            主队  比分       客队
## NULL.1 山东鲁能 1 - 0 哈尔滨毅腾
## NULL.2 广州恒大 3 - 0   河南建业
## NULL.3 北京国安 1 - 0   长春亚泰
## NULL.4 江苏舜天 0 - 0   贵州茅台
## NULL.5 杭州绿城 1 - 1 大连阿尔滨
## NULL.6 辽宁宏运 1 - 1   上海上港
head(CslPoint)
##   名次     球队 比赛 积分
## 1    1 广州恒大   20   45
## 2    2 北京国安   19   41
## 3    3 广州富力   19   34
## 4    4 上海上港   19   31
## 5    5 贵州茅台   19   30
## 6    6 山东鲁能   19   28

这样我们就得到了中超的数据,之后就可以利用我们之前在博客里讲的MCMClogisticSVM之类的办法去预测了。

这个例子节选自虎扑体育的《恒大夺冠100%,卓尔降级99%——用R语言轻松模拟中超剩余比赛》,那篇帖子也给了一个简单地预测办法,虽然不见得准确,也可以为我们的预测提供一个思路。

应用举例:获取当当网的图书定价

在比价的过程中,我们首要的任务就是从网上获取价格数据。我们该如何从当当的图书页面获取价格数据呢?

library(XML)
library(RCurl)book_price=NULLfor(i in 1:2){    url_i<-paste0("http://category.dangdang.com/pg",i,"-cp01.00.00.00.00.00.html",sep="")    url_i<-htmlParse(url_i,encoding="GBK")    #asText=TRUE,
    node_i<-getNodeSet(url_i,"//li[@class]/div[@class=\"inner\"]/a")    Attr_i<-sapply(node_i,xmlGetAttr,name="href")    for(j in Attr_i){        url_j=htmlParse(j,encoding="GBK")        node_title=getNodeSet(url_j,"//div[@class]/img[@id]")        if(length(node_title)>0){            title=xmlGetAttr(node_title[[1]],"alt")            title=iconv(title,"UTF-8","gbk")
        }        else{            next
        }        node_price=getNodeSet(url_j,"//span[@id=\"salePriceTag\"]")        if (length(node_price)>0){            price=as.numeric(xmlValue(node_price[[1]]))
            }        else{            next
        }        book_price=rbind(book_price,cbind(j,title,price))
    }
}
colnames(book_price)=c("URL","书名","价格")
write.csv(book_price,"F:/book_price.csv")

读入json 数据

json数据的一个典型的代表就是微博数据,然而除了微博外也有很多其他的网站因为json采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯使JSON成为理想的数据交换语言被许多的API使用。比如github的数据,Wikipedia article traffic statistics的数据也采用了json格式。 我们以github的API数据为例,下面是我的github的代码仓库部分数据的json格式信息,完整版本在这里

 {
    "id": 20472818,
    "name": "courses",
    "full_name": "yujunbeta/courses",
    "owner": {
      "login": "yujunbeta",
      "id": 7315956,
      "avatar_url": "https://avatars.githubusercontent.com/u/7315956?v=2",
      "gravatar_id": "e8569ebac320c9aed1764a7d693e5a87",
      "url": "https://api.github.com/users/yujunbeta",
      "html_url": "https://github.com/yujunbeta",
      "followers_url": "https://api.github.com/users/yujunbeta/followers",
      "following_url": "https://api.github.com/users/yujunbeta/following{/other_user}",
      "gists_url": "https://api.github.com/users/yujunbeta/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/yujunbeta/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/yujunbeta/subscriptions",
      "organizations_url": "https://api.github.com/users/yujunbeta/orgs",
      "repos_url": "https://api.github.com/users/yujunbeta/repos",
      "events_url": "https://api.github.com/users/yujunbeta/events{/privacy}",
      "received_events_url": "https://api.github.com/users/yujunbeta/received_events",
      "type": "User",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/yujunbeta/courses",
    "description": "Course materials for the Data Science Specialization: https://www.coursera.org/specialization/jhudatascience/1",
    "fork": true,
    "url": "https://api.github.com/repos/yujunbeta/courses",
    "forks_url": "https://api.github.com/repos/yujunbeta/courses/forks",
    "keys_url": "https://api.github.com/repos/yujunbeta/courses/keys{/key_id}",

R的jsonlite包提供了函数fromJSON来读取JSON数据。以我的github的JSON数据为例:

library(jsonlite)jsonData <- fromJSON("https://api.github.com/users/yujunbeta/repos")

我们可以通过操作jsonData来获取我的github的相应信息:

names(jsonData)#获取JSON数据的一级结构,类似于hush表的关键字
##  [1] "id"                "name"              "full_name"        
##  [4] "owner"             "private"           "html_url"         
##  [7] "description"       "fork"              "url"              
## [10] "forks_url"         "keys_url"          "collaborators_url"
## [13] "teams_url"         "hooks_url"         "issue_events_url" 
## [16] "events_url"        "assignees_url"     "branches_url"     
names(jsonData$owner)#获取所有者的基本信息
##  [1] "login"               "id"                  "avatar_url"         
##  [4] "gravatar_id"         "url"                 "html_url"           
##  [7] "followers_url"       "following_url"       "gists_url"          
## [10] "starred_url"         "subscriptions_url"   "organizations_url"  
## [13] "repos_url"           "events_url"          "received_events_url"
## [16] "type"                "site_admin"
jsonData$owner$login#获取登陆信息
##  [1] "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta"
##  [6] "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta"
## [11] "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta" "yujunbeta"
## [16] "yujunbeta" "yujunbeta" "yujunbeta"
应用举例:分析Wikipedia读者搜索趋势

在股票交易中我们经常会听到“概念股”这样一个名词,那么什么样的概念最可能走红,什么样的概念股最有可能获得多数股民的购买呢,当然就是被议论的最多的,人们最关心的,比如习大大上台时提的“美丽中国”在当时很是红火,现在最近新闻里提及的“金融改革”估计也会成为新的股市宠儿。

我们这里使用Wikipedia article traffic statistics提供的数据来看看最近人们对某一概念的关注程度如何。当然,要获得人们关注什么,什么概念在股市中最红火,靠wiki的搜索指数是远远不够的,用下面的程序赚钱还是够呛。

我们这里以最近比较红火的数据科学这一概念为例,我们来看看人们对它的关注程度:

url <- "http://stats.grok.se/json/en/latest90/data%20science"raw.data <- readLines(url, warn = "F")
library(rjson)rd <- fromJSON(raw.data)rd.views <- rd$daily_viewsrd.views <- unlist(rd.views)df <- as.data.frame(rd.views)
head(df)
##            rd.views
## 2014-06-30      620
## 2014-06-21      355
## 2014-06-20      474
## 2014-06-23      621
## 2014-06-22      390
## 2014-06-25      616
library(ggplot2)df$date <- as.Date(rownames(df))
colnames(df) <- c("views", "date")
ggplot(df, aes(date, views)) + geom_line() + geom_smooth() + theme_bw(base_size = 20)

从图中我们可以看到data science最近真的是红火的不行,然而我们再来看看相关的statistic被人们关注的程度如何?

##            rd.views
## 2014-06-30      288
## 2014-06-21      212
## 2014-06-20      233
## 2014-06-23      258
## 2014-06-22      236
## 2014-06-25      319

显然statistic被人关注的程度真是少的可怜。类似的我们还可以看看big data,machine learning,statistical learning这些相近的词汇的关注度,这里我们不在赘述。

应用举例:《后会无期》能统计什么?

曾经见过网上一个有意思的评论:我们可以通过统计观看《小时代》的人数来统计究竟有多少脑残。当然,这只是一家之言。但是我们仍然可以利用关联规则的思想:如果”小时代“的状态里出现”脑残“的概率很高,那么就基本上可以相信那条评论很有道理。

为了避免一些不必要的争端,我们不妨利用微博数据来看看国民岳父的《后会无期》究竟与什么相关,观影人数又能代表什么?

这里我们利用lijian大神的Rweibo包来看看:

require(Rweibo)res <- web.search.content("后会无期", page = 20, sleepmean = 10, sleepsd = 1)$Weiborequire(Rwordseg)
insertWords("后会无期")n <- length(res)res <- res[res != " "]words <- unlist(lapply(X = res, FUN = segmentCN))word <- lapply(X = words, FUN = strsplit, " ")wordfreq <- table(unlist(word))wordfreq <- sort(wordfreq, decreasing = TRUE)

现在我们来看看去掉一些单字词汇(如“你”,“是”之类)后的词汇频率超过20的大概有:

  TFBOYS     房间     今天     电影     偶像     手记     台湾 后会无期     遥控     大家     年轻 
      64       39       33       32       32       32       32       28       26       24       24 
    一起     战士     搭配   第一件     看看     商品     什么     知道       cn     http       ln 
      24       24       22       22       22       22       22       22       21       21       20 
      RP     每次     曝光     所以     先导     游戏   中英文     最后      
      20       20       20       20       20       20       20       20       

从着些关联词汇来看,国民岳父的《后会无期》正在被最近风头正劲的TFBOYS演唱的《后会无期》取代,TFBOYS的《后会无期》成了新的热门。不过毕竟后会无期已经上演了那么长的时间,没有人会去温习那些经典的“道理”,因为大家都知道:无论你知道多少道理,仍有可能过不好这一生。那么目前跟电影《后会无期》相关的东西可以肯定的就只有”电影“本身以及电影9月的”台湾“之行。

我们不仅可以读入JSON数据也可以通过函数toJSON将数据框写为JSON格式,例如将鸢尾花数据集写为JSON格式(输出结果较长,在此从略):

data(iris)
toJSON(iris, pretty=TRUE)

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-10-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

一条简单的sql语句导致的系统问题(r4笔记第51天)

新年,给大家拜年了。祝大家工作顺利,万事如意。 今天照例简单检查了系统的情况,发现在客户的服务器在下午的3-5点这个时间段,数据库负载略有上升,但是幅度不大,因...

3396
来自专栏代码世界

初识数据库

一、数据库概念 数据库(Database,简称DB)   数据库技术是计算机应用领域中非常重要的技术,它产生于20世纪60年代末,是数据管理的最新技术,也是软件...

3377
来自专栏杨建荣的学习笔记

巧用闪回数据库来查看历史数据 (r10笔记第47天)

国庆期间有一个例行维护的任务,需要在大早上7点起来,先根据业务指定的SQL查出指定数据,然后运行一个存储过程来更新数据。 查出来的这部分数据需要...

3074
来自专栏大数据

加速python科学计算的方法(二)

好久不见。有一年了。 很久没有更推文了,我的错。额,进入正题吧。到了年底,很多App都会放出“你今年听了多少歌”、“你今年看了多少帖子”、“你今年剁手了多少次”...

22410
来自专栏大数据挖掘DT机器学习

如何用R语言从网上读取多样格式数据

第一部分:数据信息 生活中,我们面临着各种各样的数据:比如你的成绩单,比如公司的财务报表,比如朋友圈的一些状态,比如微信里的一段语音……我们生活的大数据时代的一...

2815
来自专栏大数据和云计算技术

大数据仓库—增量更新

现在是国内凌晨3点,为了抵挡睡意,还是写写技术博客。今天和大家讨论下大数据仓库中的更新技术。 当前很多大数据技术,如HDFS最早设定的是数据不更新,只增量叠加。...

29811
来自专栏全栈数据化营销

用python采集猫眼电影排行榜信息

随着大数据和人工智能多次被大佬提及之后,并且被定义为未来的大趋势后,天然适合于大数据和人工智能的编程语言python也异常火热,市面上出现了不少的高价格、大规模...

2617
来自专栏PHP技术

mongodb与mysql相比的优缺点

与关系型数据库相比,MongoDB的优点: ①弱一致性(最终一致),更能保证用户的访问速度: 举例来说,在 传统的关系型数据库中,一个COUNT类型的操作会锁...

4055
来自专栏nimomeng的自我进阶

Swift 4.2新特性——WWDC2018 Session401笔记

厨子今年的演讲很不给力。不过既然是软件开发者大会嘛,焦点自然应该放在软件功能上。 所以我看了下今年的Session401,也就是Swift4.2新特性介绍,做...

752
来自专栏技术专栏

Storm 稳定态

假设一个topology有4个worker,2个spout,2个bolt。spout1有4个task,spout2有2个task,bolt1有4个task,bo...

731

扫描关注云+社区