Education | 初学者如何学习R语言?内含R语言会图及28个程序实用安装包

学习r
学习r


对于初学者,推荐几本参考书非常有必要。《R语言实战(2nd)》被称为R界文献的圣经,足见其分量,但价格不菲;《R语言核心技术手册》也是不错的参考书,可以学到很多基本功,就如习武者,必练基本功,当然书价也不低;《R数据可视化手册》是ggplot2包制图的攻略,可以让读者很快入门ggplot2绘制各种常见图形,只惜书价不美丽;最后推荐我主编的书《R与ASReml-R统计学》,本书集成数据管理、数据统计、图形绘制和混合线性模型分析,仅高级图形绘制就包含lattice包和ggplot2包的使用章节,书价相对而言,合理很多。个人觉得,可以作为R初学者的一个补充材料,货真价实。

林元震主编.《R与ASReml-R统计学》.中国林业出版社.2017.

Robert.《R语言实战(2nd)》.人民邮电出版社.2016.

Joseph.《R语言核心技术手册》.电子工业出版社.2014.

Winston Chang著《R数据可视化手册》.2014.

我在《R与ASReml-R统计学》书中提到如何有效学习R,大致有以下6点:

熟悉语法。任何一门编程语言都有其语法,R也不例外,语法必须学习。

训练思维。与其它编程语言类似,R编程也需要严谨的逻辑思维。

熟能生巧。学习任何新东西,都有一个模仿过程,R也是如此。

善于求助。R拥有庞大的社区论坛和全球用户,通过求助方式学习也是提高R能力的有效途径之一。

不怕犯错。犯错是R学习进步的捷径。回顾笔者自学R的过程,就是在不断犯错中前进的,每一次犯错然后纠错就是一次进步。

保持兴趣。兴趣是最好的老师,只要坚持R的求知欲,持之以恒,一定会有成效。

上述几点,是通用法则,学习任何软件都存在相似情况。下面讲讲,对于R初学者,应该如何从零开始。

第一、下载安装R软件。同时,建议下载安装Rstudio软件,都是免费。RStudio是一个非常优秀的R语言操作界面。RStudio与R语言相似,可以在各种操作系统(Windows,Mac,或者Linux)中运行。RStudio可以让R语言代码更直观、明了地运行。至于如何在R或Rstudio输入代码,这里不讲,可以参阅《R与ASReml-R统计学》或者其它网络资源。

第二、R的强大之处在于拥有非常广泛且数量惊人的外延程序包packages。截至2018年7月13日,在CRAN社区上可使用的程序包就有12747个,还不包括BioCondutor和R-Forge网站的程序包。外延的CRAN社区程序包packages需要通过命令 install.packages()进行安装,例如安装stringi,下面两种方法都可以,一般使用第一种情况,如果失败了,再考虑第二种方法。注意type参数除了’win.binary’,也可以是’mac.binary’,根据电脑系统而定。BioCondutor和R-Forge网站的程序包安装方法在其网站都有介绍。

install.packages("stringi")
install.packages("stringi", type = 'win.binary')

对于R初学者,不建议安装太多的程序包!

第三、要参透R的强大主要是程序包的函数来实现各种数据处理、统计分析以及图形绘制。因此学R就是学R函数。函数也都是针对数据而言,换言之,如果没有数据,也就无需谈论R。于是,了解数据及其结构是第一要务

(1) 学习函数data()的功能。好的程序包往往都有内置数据集,因此可以通过示例数据学习程序包内的各种函数。

data() # 查看R内置数据集
data( package = 'ggplot2') # 查看ggplot2包内数据集
data("diamonds", package = 'ggplot2') # 调用diamonds数据集

(2) 查看数据的结构,主要是数据变量、类型及部分子集。

data("diamonds", package = 'ggplot2') # 调用diamonds数据集
names(diamonds) # 数据集变量
str(diamonds)   # 数据集结构
class(diamonds) # 数据集属性
dim(diamonds)   # 数据集维度
head(diamonds)  # 数据集头6行
tail(diamonds)  # 数据集末6行

对于R初学者,上述命令非常有必要,尤其在学习使用新函数时。

(3)  读取外部数据。

 setwd('D:/Rdata') # 设置路径在文件夹D:\Rdata
 df <- read.csv( file = 'dat.csv', header = TRUE )

对于R初学者,建议在D盘新建文件夹Rdata,然后上述的setwd('D:/Rdata')就可直接使用。

(4) 学会查看函数及其使用条件。

library(breedR)
data("globulus")
dat <- globulus
gen.dat <- list(model = 'add_animal',
                pedigree = dat[,1:3],
                id = 'self')          
blkM.bdR <- remlf90(
  fixed = phe_X ~ gg,
  genetic = gen.dat,
  spatial = list(model = 'blocks',
                 coord = dat[, c('x','y')],
                 id = "bl"),
  dat = dat)

plot(blkM.bdR, 'residuals')

通过上述的简短plot()代码即可绘图,但这不代表我们可以随意传递一份数据给plot()就能得到类似图形。

因此,应该了解模型运行结果blkM.bdR的属性,通过class()和mode()运行结果可知,blkM.bdR属性为breedR和remlf90,并且数据结构是列表list。

class(blkM.bdR)
[1] "breedR"  "remlf90"
mode(blkM.bdR)
[1] "list"

事实上,plot()函数是一个泛函数,即其包含很多子函数,命名为plot.XX(),XX一般为子函数的类,通过methods(plot)可以查看到具体的子函数,也可找到上述示例的子函数为plot.remlf90。

methods(plot)
 [1] plot,ANY,ANY-method                        
     plot,color,ANY-method                     
 [3] plot,Spatial,missing-method                
     plot,SpatialGrid,missing-method  
 ...
 [61] plot.raster*                              
      plot.remlf90*    
 ...

如果想要查看plot.remlf90()的具体代码,只需输入getAnywhere('plot.remlf90')即可。

通过plot.remlf90()函数代码,可知与上述图形的相关代码部分如下:

function (x, type = c("phenotype", "fitted", "spatial", "fullspatial", 
    "residuals"), z = NULL, ...) {  
  ...  
  type = match.arg(type)
  coord <- coordinates(x))  if (type == "residuals") {
    p <- spatial.plot(data.frame(coord, z = residuals(x)), 
                       scale = "div")
  }  
  ...
}

如果想要知道如何使用plot.remlf90(),只需输入?plot.remlf90即可搜到其用法:

对于R初学者的忠告,学R是一个过程,不要急功近利得学!慢慢参透数据结构和函数里数据属性与使用条件。只要领会了这点,并学会有技巧地检索问题,R的学习很快就会成为一种乐趣!



# 示例参考帮助文档

# 我用Rstudio重现了所有示例

# 本文以字母顺序排序程序包

# 更多用于R语言绘图的程序包,欢迎在留言区补充


cartogram

扭曲的地图,以传达统计信息

开发

Sebastian Jeworutzki,

sebastian.jeworutzki@ruhr-uni-bochum.de;

Timothee Giraud;

Nicolas Lambert;

Roger Bivand;

Edzer Pebesma

示例

# 安装并加载包

install.packages("maptools")

library(maptools)

# 绘制非洲边界

data(wrld_simpl)

afr=wrld_simpl[wrld_simpl$REGION==2,]

plot(afr)

# 安装并加载包

install.packages("cartogram")

library(cartogram)

# 使用2005年的非洲人口数据

afr_cartogram <- cartogram(afr, "POP2005", itermax=5)

# 反映非洲人口特征

plot(afr_cartogram)



circlize

圈圈布局、弦图

开发

Zuguang Gu,

z.gu@dkfz.de

示例

# 安装并加载包

install.packages("circlize")

library(circlize)

# 生成数据

name=c(3,10,10,3,6,7,8,3,6,1,2,2,6,10,2,3,3,10,4,5,9,10)

feature=paste("feature ", c(1,1,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5) , sep="")

dat <- data.frame(name,feature)

dat <- with(dat, table(name, feature))

# 绘制弦图

chordDiagram(as.data.frame(dat), transparency = 0.5)



CMplot

圆形曼哈顿图

开发

LiLin-Yin

ylilin@163.com

示例

# 安装并加载包

install.packages("CMplot")

library("CMplot")

# 绘图

CMplot(gwasResults, plot.type="c", r=1.6, cir.legend=TRUE, outward=TRUE, cir.legend.col="black", cir.chr.h=.1 ,chr.den.col="orange", file="jpg",        memo="", dpi=300, chr.labels=seq(1,22))



corrgram

相关系数矩阵

开发

Kevin Wright,

kw.stat@gmail.com

示例

# 安装并加载包

install.packages("iterators")

install.packages("corrgram")

library(iterators)

library(corrgram)

# 绘制相关系数矩阵图

corrgram(mtcars, order=TRUE, lower.panel=panel.shade, upper.panel=panel.pie,text.panel=panel.txt, main="Correlogram of mtcar intercorrelations")



corrplot

相关系数矩阵

开发

Taiyun Wei,

weitaiyun@gmail.com;

Viliam Simko,

viliam.simko@gmail.com

示例

# 安装并加载包

install.packages("corrplot")

library(corrplot)

# 计算相关系数

mycor <- cor(mtcars)

# 绘制相关系数矩阵图

corrplot.mixed(mycor, upper = "ellipse")


forecast

时间序列分析

开发

Rob J Hyndman,

Rob.Hyndman@monash.edu

示例

# 安装并加载包

install.packages("forecast")

library(forecast)

# 使用英国每月死于肺病的人数数据

fit<- auto.arima(mdeaths)

# 设置置信区间

forecast(fit, level=c(80, 95, 99), h=3)

# 绘制时间序列趋势图

plot(forecast(fit), shadecols="oldstyle")



GGally

散点图矩阵

开发

Barret Schloerke,

schloerke@gmail.com;

Jason Crowley,

crowley.jason.s@gmail.com;

Di Cook,

dicook@monash.edu;

Heike Hofmann,

hofmann@iastate.edu;

Hadley Wickham,

h.wickham@gmail.com;

Francois Briatte,

f.briatte@gmail.com;

Moritz Marbach,

mmarbach@mail.uni-mannheim.de;

Edwin Thoen,

edwinthoen@gmail.com;

Amos Elberg,

amos.elberg@gmail.com;

Joseph Larmarange,

joseph@larmarange.net

示例

# 安装并加载包

install.packages("GGally")

library(GGally)

# 绘制相关系数矩阵图

ggpairs(mtcars, columns = c("mpg", "cyl", "disp"),upper = list(continuous = wrap("cor", size = 10)), lower =list(continuous = "smooth"))



ggplot2

丰富的数据可视化

开发

Hadley Wickham,

hadley@rstudio.com;

Winston Chang,

winston@rstudio.com

示例

# 安装并加载包

install.packages("ggplot2")

library(ggplot2)

# 生成数据

variety=rep(LETTERS[1:7], each=40)

treatment=rep(c("high","low"),each=20)

note=seq(1:280)+sample(1:150, 280, replace=T)

data=data.frame(variety, treatment ,  note)

# 绘制箱线图

ggplot(data, aes(x=variety, y=note, fill=treatment)) +

geom_boxplot()

# 生成数据

set.seed(345)

Sector <- rep(c("S01","S02","S03","S04","S05","S06","S07"),times=7)

Year <- as.numeric(rep(c("1950","1960","1970","1980","1990","2000","2010"),each=7))

Value <- runif(49, 10, 100)

data <- data.frame(Sector,Year,Value)

# 绘制区域图

ggplot(data, aes(x=Year, y=Value, fill=Sector)) +

    geom_area()

# 安装并加载包

install.packages("plotly")

install.packages("gapminder")

library(plotly)

library(gapminder)

# 绘制气泡图

p <- gapminder %>%

  filter(year==1977) %>%

  ggplot( aes(gdpPercap, lifeExp, size = pop, color=continent)) +

  geom_point() +

  scale_x_log10() +

  theme_bw()

ggplotly(p)



ggridges

叠嶂图(山峦图)

开发

Claus O. Wilke,

wilke@austin.utexas.edu

示例

# 安装并加载包

install.packages("ggridges")

install.packages("ggplot2")

library(ggridges)

library(ggplot2)

# 使用钻石数据

head(diamonds)

# 绘制叠嶂图

ggplot(diamonds, aes(x = price, y = cut, fill = cut)) +

  geom_density_ridges() +

  theme_ridges() +

  theme(legend.position = "none")



hexbin

二维直方图

开发

Dan Carr,

dcarr@voxel.galaxy.gmu.edu;

Nicholas Lewin-Koh;

Martin Maechler,

maechler@stat.math.ethz.ch;

Deepayan Sarkar,

deepayan.sarkar@r-project.org

示例

# 安装并加载包

install.packages("hexbin")

install.packages("RColorBrewer")

library(hexbin)

library(RColorBrewer)

# 生成数据

x <- rnorm(mean=1.5, 5000)

y <- rnorm(mean=1.6, 5000)

# 绘制二维散点图

bin<-hexbin(x, y, xbins=40)

my_colors=colorRampPalette(rev(brewer.pal(11,'Spectral')))

plot(bin, main="", colramp=my_colors, legend=F)



igraph

网络图

示例

# 安装并加载包

install.packages("igraph")

library(igraph)

# 生成数据

data=matrix(sample(0:1, 400, replace=TRUE, prob=c(0.8,0.2)), nrow=20)

network=graph_from_adjacency_matrix(data , mode='undirected', diag=F )

# 输出网络

par(mfrow=c(2,2), mar=c(1,1,1,1))

plot(network, layout=layout.sphere, main="sphere")



lattice

点图、核密度图、直方图、柱状图、箱线图、散点图、带状图、平行箱线图、三维图、散点图矩阵等

开发

Deepayan Sarkar,

Deepayan.Sarkar@R-project.org

示例

# 安装并加载包

install.packages("lattice")

library(lattice)

# 查看火山数据

head(volcano)

# 绘制火山的三维等高线图

contourplot(volcano)

# 绘制火山的三维水平图

levelplot(volcano)

# 绘制火山的三维线框图

wireframe(volcano)

# 查看汽车数据

head(mtcars)

# 绘制箱线图

bwplot(mtcars$mpg)

# 绘制平行坐标图

parallelplot(mtcars[1:3])

# 绘制散点图矩阵

splom(mtcars[c(1,3,4,5)])

# 绘制带状图

stripplot(mtcars$mpg~factor(mtcars$cyl))



maps

地图

开发

Richard A. Becker;

Allan R. Wilks;

Ray Brownrigg

示例

# 安装并加载包

install.packages("maps")

install.packages("geosphere")

library(maps)

library(geosphere)

# 绘制世界地图

map("world")



maptools

地图

开发

Roger Bivand,

Roger.Bivand@nhh.no;

Nicholas Lewin-Koh;

Edzer Pebesma;

Eric Archer;

Adrian Baddeley;

Nick Bearman;

Hans-Jörg Bibiko;

Steven Brey;

Jonathan Callahan;

German Carrillo;

Stéphane Dray;

David Forrest;

Michael Friendly;

Patrick Giraudoux;

Duncan Golicher;

Virgilio Gómez Rubio;

Patrick Hausmann;

Karl Ove Hufthammer;

Thomas Jagger;

Kent Johnson;

Sebastian Luque;

Don MacQueen;

Andrew Niccolai;

Edzer Pebesma;

Oscar Perpiñán Lamigueiro;

Tom Short;

Greg Snow;

Ben Stabler;

Murray Stokely;

Rolf Turner

示例

# 安装并加载包

install.packages("maptools")

library(maptools)

# 绘制非洲边界

data(wrld_simpl)

afr=wrld_simpl[wrld_simpl$REGION==2,]

plot(afr)



performanceAnalytics

绩效指标计算与可视化

开发

Brian G. Peterson,

brian@braverock.com;

Peter Carl

示例

# 安装并加载包

install.packages("PerformanceAnalytics")

library(PerformanceAnalytics)

# 列出待计算变量

mydata <-mtcars[c('mpg','cyl','disp','hp','drat')]

# 绘制相关系数矩阵图

chart.Correlation(mydata, histogram=TRUE, pch=19)



plotly

交互式可视化

开发

Carson Siever,

cpsievert1@gmail.com;

Chris Parmer,

chris@plot.ly;

Toby Hocking,

tdhock5@gmail.com;

Scott Chamberlain,

myrmecocystus@gmail.com;

Karthik Ram,

karthik.ram@gmail.com;

Marianne Corvellec,

marianne@plot.ly;

Pedro Despouy,

pedro@plot.ly

示例

# 安装并加载包

install.packages("plotly")

library(plotly)

# 查看火山数据

head(volcano)

# 绘制火山的三维交互图

p=plot_ly(z = volcano, type = "surface")

p



qcc

统计质量控制

开发

Luca Scrucca,

luca.scrucca@unipg.it;

Greg Snow,

greg.snow@ihc.com;

Peter Bloomfield,

Peter_Bloomfield@ncsu.edu

示例

# 安装并加载包

install.packages("qcc")

library(qcc)

# 均值为10的序列,加上白噪声

x <- rep(10, 100) + rnorm(100)

# 测试序列,均值为11

new.x <- rep(11, 15) + rnorm(15)

# 标记出新的点

qcc(x, newdata=new.x, type="xbar.one")



qqman

曼哈顿图

开发

Stephen Turner

示例

# 安装并加载包

install.packages("qqman")

library(qqman)

# 使用gwasResults数据绘制曼哈顿图

manhattan(gwasResults, chr="CHR", bp="BP", snp="SNP", p="P" )



REmap

地图

开发

Dawei Lang,

dawei.lang@supstat.com

示例

# 安装并加载包

install.packages("devtools")

install_github("lchiffon/REmap")

library(devtools)

library(REmap)

# 标注起始点

origin<-c("济南","西安","成都")

destination<-c("西安","成都","济南")

# 制作迁徙地图

dat = data.frame(origin,destination)

out = remap(dat,title = "after-graduation trip ",subtitle= "zg434")

plot(out)



scatterplot3d

三维散点图

开发

Uwe Ligges,

ligges@statistik.tu-dortmund.de;

Martin Maechler;

Sarah Schnackenberg

示例

# 安装并加载包

install.packages("scatterplot3d")

library(scatterplot3d)

# 生成数据

x1=round(rnorm(100,mean=80,sd=1))

x2=round(rnorm(100,mean=80,sd=5))

x3=round(rnorm(100,mean=80,sd=10))

x=data.frame(x1,x2,x3)

# 绘制三维散点图

scatterplot3d(x[1:3])



TeachingDemos

脸谱图

开发

Greg Snow,

538280@gmail.com

示例

# 安装并加载包

install.packages("TeachingDemos")

library(TeachingDemos)

# 生成数据

x1=round(rnorm(100,mean=80,sd=1))

x2=round(rnorm(100,mean=80,sd=5))

x3=round(rnorm(100,mean=80,sd=10))

x=data.frame(x1,x2,x3)

# 绘制脸谱图

faces(x)



treemap

树图

开发

Martijn Tennekes,

mtennekes@gmail.com

示例

# 安装并加载包

install.packages("treemap")

library(treemap)

# 生成数据

group=c("group-1","group-2","group-3")

value=c(13,5,22)

data=data.frame(group,value)

# 绘制树图

treemap(data, index="group", vSize="value", type="index")



vioplot

小提琴图

开发

Daniel Adler,

dadler@uni-goettingen.de;

Romain Francois,

francoisromain@free.fr

示例

# 安装并加载包

install.packages("vioplot")

library(vioplot)

# 生成数据

treatment=c(rep("A", 40) , rep("B", 40) , rep("C", 40) )

value=c( sample(2:5, 40 , replace=T) , sample(c(1:5,12:17), 40 , replace=T), sample(1:7, 40 , replace=T) )

data=data.frame(treatment,value)

# 绘制小提琴图

with(data , vioplot( value[treatment=="A"] , value[treatment=="B"], value[treatment=="C"],  col=rgb(0.1,0.4,0.7,0.7) , names=c("A","B","C") ))



好啦,今天的入门教程就到这里啦

需要更多R语言辅导和帮助的同学扫描下方二维码



侨民圈 | 公众号媒体合作推广请戳这里

微信又改版了,为了防止跟大家在信息流中走散

点击资料页右上角的,给我们加星标吧

推荐