第一部分:数据信息
生活中,我们面临着各种各样的数据:比如你的成绩单,比如公司的财务报表,比如朋友圈的一些状态,比如微信里的一段语音……我们生活的大数据时代的一个重要特征便是数据的多样化(variety)。 也许你期待的数据是这样的:
代码语言:javascript复制## 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
然而事实上我们面临的数据确实这样的:
代码语言:javascript复制@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
还有这样的:
代码语言:javascript复制{
"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可以从互联网上直接把数据拽下来。其调用格式为:
代码语言:javascript复制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写一个函数来实现输入股票代码,将资产负债表下载到指定目录:
代码语言:javascript复制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包的主要函数介绍如下:
代码语言:javascript复制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文件(因为中文有些网站会出现乱码,为了避免不必要的麻烦,我们暂时使用英文网站,稍后的例子会有中文的):
代码语言:javascript复制library(RCurl)
library(XML)url <- "http://www.bbc.com/news/entertainment-arts-28761353"SOURCE <- getURL(url,encoding="UTF-8") #Download the page
代码语言:javascript复制## Error: transfer closed with 78288 bytes remaining to read
代码语言:javascript复制#this is a very very long line. Let's not print it. Instead:substring (SOURCE,1,200)
代码语言:javascript复制## Error: 找不到对象'SOURCE'
代码语言:javascript复制PARSED <- htmlParse(SOURCE) #Format the html code d
代码语言:javascript复制## Error: 找不到对象'SOURCE'
- 获取HTML的元素
我们可以通过XPath的相关函数来获取HTML的相关信息:
代码语言:javascript复制xpathSApply(PARSED, "//h1")
代码语言:javascript复制## Error: 找不到对象'PARSED'
这样的标题由于含有HTML标记,让我们很不爽,我们可以通过下面函数来去掉它:
代码语言:javascript复制xpathSApply(PARSED, "//h1",xmlValue)
代码语言:javascript复制## Error: 找不到对象'PARSED'
相应的函数调用格式如下:
代码语言:javascript复制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里的关键词来发现很多东西,比如我们想知道这个页面有多少条链接,我们只需要运行:
代码语言:javascript复制length(xpathSApply(PARSED, "//a/@href"))
再比如我们想要知道新闻的日期,我们可以运行:
代码语言:javascript复制xpathSApply(PARSED, "//span[@class='date']",xmlValue)
最后要说的是,你的挖掘一定要对HTML的结构十分的熟悉,比如页面有哪些元素,这是第几级的结构等,方便在使用@时确定能找到有关属性,比如说我想知道BBC报道了哪些最近的关于中国的新闻,我们就可以运行以下代码:
代码语言:javascript复制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)
代码语言:javascript复制## [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函数:
代码语言:javascript复制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))
代码语言:javascript复制## [,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函数可以帮我们把东西轻而易举的办到,我们先来看看函数的调用格式:
代码语言:javascript复制readHTMLTable(doc, header = NA,
colClasses = NULL, skip.rows = integer(), trim = TRUE,
elFun = xmlValue, as.data.frame = TRUE, which = integer(),
...)
我们以保利地产的分红情况为例来说明函数的使用:
代码语言:javascript复制url<-"http://money.finance.sina.com.cn/corp/go.php/vISSUE_ShareBonus/stockid/600048.phtml"data<-readHTMLTable(url,header=NA, which=19)data
代码语言:javascript复制## 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文件,再重新读取出来,即:
代码语言:javascript复制write.table(data,"F:/table.txt")
read.table("F:/table.txt",encoding = "UTF-8")
代码语言:javascript复制## 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函数从网易载入中超赛程数据:
代码语言:javascript复制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)
代码语言:javascript复制## 主队 比分 客队
## NULL.1 山东鲁能 1 - 0 哈尔滨毅腾
## NULL.2 广州恒大 3 - 0 河南建业
## NULL.3 北京国安 1 - 0 长春亚泰
## NULL.4 江苏舜天 0 - 0 贵州茅台
## NULL.5 杭州绿城 1 - 1 大连阿尔滨
## NULL.6 辽宁宏运 1 - 1 上海上港
代码语言:javascript复制head(CslPoint)
代码语言:javascript复制## 名次 球队 比赛 积分
## 1 1 广州恒大 20 45
## 2 2 北京国安 19 41
## 3 3 广州富力 19 34
## 4 4 上海上港 19 31
## 5 5 贵州茅台 19 30
## 6 6 山东鲁能 19 28
这样我们就得到了中超的数据,之后就可以利用我们之前在博客里讲的MCMC,logistic,SVM之类的办法去预测了。
这个例子节选自虎扑体育的《恒大夺冠100%,卓尔降级99%——用R语言轻松模拟中超剩余比赛》,那篇帖子也给了一个简单地预测办法,虽然不见得准确,也可以为我们的预测提供一个思路。
应用举例:获取当当网的图书定价
在比价的过程中,我们首要的任务就是从网上获取价格数据。我们该如何从当当的图书页面获取价格数据呢?
代码语言:javascript复制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格式信息,完整版本在这里
代码语言:javascript复制 {
"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数据为例:
代码语言:javascript复制library(jsonlite)jsonData <- fromJSON("https://api.github.com/users/yujunbeta/repos")
我们可以通过操作jsonData来获取我的github的相应信息:
代码语言:javascript复制names(jsonData)#获取JSON数据的一级结构,类似于hush表的关键字
代码语言:javascript复制## [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"
代码语言:javascript复制names(jsonData$owner)#获取所有者的基本信息
代码语言:javascript复制## [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"
代码语言:javascript复制jsonData$owner$login#获取登陆信息
代码语言:javascript复制## [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的搜索指数是远远不够的,用下面的程序赚钱还是够呛。
我们这里以最近比较红火的数据科学这一概念为例,我们来看看人们对它的关注程度:
代码语言:javascript复制url <- "http://stats.grok.se/json/en/latest90/data science"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)
代码语言:javascript复制## 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
代码语言:javascript复制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被人们关注的程度如何?
代码语言:javascript复制## 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包来看看:
代码语言:javascript复制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的大概有:
代码语言:javascript复制 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月的”中国台湾“之行。
- Useful link:
- Rwordseg的相关信息,例子
- Rweibo的相关信息,例子
我们不仅可以读入JSON数据也可以通过函数toJSON将数据框写为JSON格式,例如将鸢尾花数据集写为JSON格式(输出结果较长,在此从略):
代码语言:javascript复制data(iris)
toJSON(iris, pretty=TRUE)