【框架语言】R语言基础

image

1 什么是R语言
R语言是一个开源的数据分析环境,起初是由数位统计学家建立起来,以更好的进行统计计算和绘图,这篇wiki中包含了一些基本情况的介绍。由于R可以通过安装扩展包(Packages)而得到增强,所以其功能已经远远不限于统计分析,如果感兴趣的话可以到官方网站了解关于其功能的更多信息。

至于R语言名称的由来则是根据两位主要作者的首字母(Robert Gentleman and Ross Ihaka),但过于简短的关键词也造成在搜索引擎中很不容易找到相关的资料。不过这个专门的搜索网站可以帮到你。

image

2 为什么要学习R语言点我,给你一千个R的理由
可能你想说,“我已经学会了spss/sas/stata...,为什么还要去学习R呢?”如下几方面可能会吸引到你:

  • 编程入门语言: 如果你之前没有编程经验,但是学习工作中经常需要计算、统计、绘图,那R是你的首选(Python也许不太同意,不管他)。语法结构简单,上手较快,而且函数和pckages都有很好的实例文档。R是一门自学型语言,来R吧,你不会孤独。

  • R是免费开源软件:现在很多学术期刊都对分析软件有版权要求,而免费的分析工具可以使你在这方面不会有什么担心。另一方面,如果学术界出现一种新的数据分析方法,那么要过很长一段时间才会出现在商业软件中。但开源软件的好处就在于,很快就会有人将这种方法编写成扩展包,或者你自己就可以做这件工作。

  • 命令行工作方式:许多人喜欢类似SPSS菜单式的操作,这对于初学者来说很方便入门,但对于数据分析来说,命令行操作会更加的灵活,更容易进行编程和自动化处理。而且命令行操作会更容易耍酷,不是嘛,一般人看到你在狂敲一推代码后得到一个分析结果,对你投来的目光是会不一样的。

  • 小巧而精悍:R语言的安装包更小,大约不到40M,相比其它几个大家伙它算是非常小巧精悍了。目前R语言非常受到专业人士欢迎,根据对数据挖掘大赛胜出者的调查可以发现,他们用的工具基本上都是R语言。此外,从最近几次R语言大会上可以了解到,咨询业、金融业、医药业都在大量的使用R语言,包括google/facebook的大公司都在用它。因此,学习R语言对你的职业发展一定是有帮助的。

    image

3 R语言的学习方法
学习R是一件非常轻松的事情,初学者需要记住的就是:

利用丰富的帮助文档
亲手键入代码并理解其意义
在笔记里记下一些重点或心得(个人推荐Evernote)
坚持练习,对手边的数据进行应用分析
理解背景知识,细节很重要。

R的获取
image
image
R包(package)

R包(package):R函数、数据、帮助文件、预编译代码以一种定义完善的格式组成的集合

.libPaths("E:/Rstudio/R_packages") #指定安装包的路径
联网安装
install.packages(“vegan”) #安装普通包
source(“https://bioconductor.org/biocLite.R”)#安装Bioconductor包
biocLite("DESeq2")

安装本地zip包
Packages>install packages from local files

library(vegan) #加载包,也可用require()
update.packages("vegan") #包的更新
installed.packages() #查看已安装的包

image
image

1 基础数据结构

1.1 向量

#创建向量
a <-c(1, 2, 3, 4, 5, 6)
b<-c("one", "two", "three")
c<-c(TRUE, FALSE, TRUE, TRUE, FALSE)
#向量索引
a[2] #第二个元素
a[-2] #删除第二个元素
a[c(2:4)] #取出第二到第四个元素

[1] 2
[1] 1 3 4 5 6
[1] 2 3 4

image

1.2 矩阵

#创建矩阵
mymat <- matrix(c(1:10), nrow=2, ncol=5, byrow=TRUE)
#矩阵索引
mymat[2,] #取第二行
mymat[,2] #取第二列
mymat[1,5] #第一行第五列的元素

image

1.3 数组

#创建数组
myarr <- array(c(1:12),dim=c(2,3,2))
dim(myarr) #取矩阵或数组的维度
myarr[1,2,1] #取第一个矩阵的第一行第二列

1.4 数据框

image
image
#创建数据框
kids <- c("Wang", "Li")
age <- c("18", "16")
df <- data.frame(kids, age)
#数据框索引
df[1,] #第一行
df[,2] #第二列
df[1:2,1:2]#前两行,前两列
df$kids #根据列名称
#数据框常用函数
str(df) #数据框的结构
rownames(df) #行名称
colnames(df) #列名称

1.4.1 因子变量

变量:类别变量,数值变量
类别数据对于分组数据研究非常有用。(男女,高中低)
R中的因子变量类似于类别数据。

#向量因子化
status<-c("Poor", "Improved", "Improved","Excellent", "Poor")
status<-rep(status,15)
status<-factor(status,ordered=TRUE,
               levels= c("Poor","Improved", "Excellent"),
               labels=c("P","I","E"))

index <- sample(1:100,75)
plotdata <- data.frame(index,status)
attach(plotdata)
boxplot(index~status,col="red")

image

类别变量,有序变量称为因子,决定了数据的分析方式和视觉呈现形式
Attach()可以将数据框添加到R的搜索路径中,当R遇到一个变量名后,将检测搜索路径中的数据框,定位这个变量

1.5 列表

列表以一种简单的方式组织和调用不相干的信息
R函数的许多运行结果都是以列表的形式返回

#创建列表
lis <- list(name='fred',
    wife='mary',
    no.children=3,
    child.ages=c(4,7,9))
#列表索引
lis$name #列表组件名
lis[[1]] #列表位置访问

常用函数
image
image

R流程控制

image
p <- 0.1 
if(p<=0.05){
  print("p<=0.05!")
}else{
  print("p>0.05!")
}

image
for(i in 1:10) {
  print(i)
}
i <- 1
while(i<10) 
   {
    print(i)
    i <- i + 1
  }

image
v <- LETTERS[1:6]
for (i in v){
  if(i == 'D'){
    next
  }
  print(i)
}

image
v <- LETTERS[1:6]
for (i in v){
  if(i == 'D'){
    break
  }
  print(i)
}

2.5 R函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段

rcal<-function(x,y)
{
  z <- x^2 + y^2; 
  result<-sqrt(z) ;
  result;
}
rcal(3,4)# 调用函数

3读写数据

#数据读入
#getwd()
setwd('C:/Users/Administrator/Desktop/file')
dir()
top<-read.table("otu_table.p10.relative.tran.xls",header=T,row.names=1,sep='\t',stringsAsFactors = F)
top10<-t(top)
head(top10, n=2)
#数据写出
logtop10<-log(top10+0.000001)
write.csv(logtop10,file="logtop10.csv", quote=FALSE,  row.names = TRUE)
write.table(logtop10,file="logtop10.xls",sep="\t", quote=FALSE, 
    row.names = TRUE, col.names = TRUE)

其他常用函数

image

4 数据清理

image

4.1 tidyr包

tidyr包的四个函数
宽数据转为长数据:gather()
长数据转为宽数据:spread()
多列合并为一列: unite()
将一列分离为多列:separate()

library(tidyr)
gene_exp <- read.table('geneExp.csv',header = T,sep=',',stringsAsFactors = F)
head(gene_exp)
#gather 宽数据转为长数据
gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneID)
head(gene_exp_tidy)
#spread 长数据转为宽数据
gene_exp_tidy2<-spread(data = gene_exp_tidy, key = "sample_name", value = "expression")
head(gene_exp_tidy2)

image

4.2 dplyr包

dplyr包五个函数用法:
筛选: filter
排列: arrange()
选择: select()
变形: mutate()
汇总: summarise()
分组: group_by()

library(tidyr)
library(dplyr)
gene_exp <- read.table("geneExp.csv",header=T,sep=",",stringsAsFactors = F)
gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneID)
#arrange 数据排列
gene_exp_GeneID <- arrange(gene_exp_tidy, GeneID)#降序加desc
head(gene_exp_GeneID )
#filter 数据按条件筛选
gene_exp_fiter <- filter(gene_exp_GeneID ,expression>10)
head(gene_exp_fiter)
#select 选择对应的列
gene_exp_select <- select(gene_exp_fiter ,sample_name,expression)
head(gene_exp_select)

image

5 绘图

image

5.1 长数据与宽数据

image
library(tidyr)
library(ggplot2)
#基础绘图
file <- read.table("geneExp.csv",header=T,sep=",",stringsAsFactors = F,row.names = 1)
#宽数据
file
barplot(as.matrix(file),names.arg = colnames(file), beside =T ,col=terrain.colors(6))
legend("topleft",legend = rownames(file),fill = terrain.colors(6))
#ggplot2绘图
gene_exp <- read.table("geneExp.csv",header=T,sep=",",stringsAsFactors = F)
gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneID)
#长数据
head(gene_exp_tidy)
ggplot(gene_exp_tidy,aes(x=sample_name,y=expression,fill=GeneID)) + geom_bar(stat='identity',position='dodge')

image

5.2 图形参数位置

image
x <- rnorm(20, 2, 1)
y <- rnorm(20, 4, 2)
plot(x, y, cex=c(1:3), type="p", pch=19, col = "blue",
     cex.axis=1.5, col.axis="darkgreen", font.axis=2,
     main="这是主标题:plot初试", font.main=2, cex.main=2, col.main="green",
     sub="这是副标题:图1", font.sub=3, cex.sub=1.5, col.sub="red",
     xlab="这是x轴标签", ylab="这是y轴标签",cex.lab=1.5, font.lab=2, col.lab="grey20",
     xlim=c(0,3), ylim=c(0,7))
abline(h=2, v=3, lty=1:2, lwd=2,col="red")
legend("topright", legend="我是图例\n我在这儿",
      text.col="red", text.width=0.5)
#Rnorm正态分布 个数 平均值 标准差 plot是泛型函数,根据输入类型的不同而变化
#Type p 代表点 l 代表线 b 代表两者叠加

image
  • 图形参数:
    符号和线条:pch、cex、lty、lwd
    颜色:col、col.axis、col.lab、col.main、col.sub、fg、bg
    文本属性:cex、cex.axis、cex.lab、cex.main、cex.sub、font、font.axis、font.lab、font.main、font.sub

  • 文本添加、坐标轴的自定义和图例
    title()、main、sub、xlab、ylab、text()
    axis()、abline()
    legend()

  • 多图绘制时候,可使用par()设置默认的图形参数
    par(lwd=2, cex=1.5)

  • 图形参数设置:
    par(optionname=value,…)
    par(pin=c(width,height)) 图形尺寸
    par(mfrow=c(nr,nc)) 图形组合,一页多图
    layout(mat) 图形组合,一页多图
    par(mar=c(bottom,left,top,right)) 边界尺寸
    par(fig=c(x1,x2,y1,y2),new=TURE) 多图叠加或排布成一幅图

#图形组合:
attach(mtcars)
opar <- par(no.readonly=TRUE) #复制当前图形参数设置
par(mfrow=c(2,2))#设置图形参数
#layout(matrix(c(1,2,2,3),2,2,byrow=TRUE))
plot(wt,mpg,main="Scatterplot of wt vs mpg")
hist(wt,main="Histogram of wt")
boxplot(wt,main="Boxplot of wt")
par(opar) #返回原始图形参数
detach(mtcars)

image

5.3 柱形图

file <- read.table("barData.csv",header=T,row.names=1,sep=",",stringsAsFactors = F)
dataxx <- as.matrix(file) #转化为矩阵
cols <- terrain.colors(3) #抽取颜色
#误差线函数
plot.error <- function(x, y, sd, len = 1, col = "black") {
  len <- len * 0.05
    arrows(x0 = x, y0 = y, x1 = x, y1 = y - sd, col = col, angle = 90, length = len)
    arrows(x0 = x, y0 = y, x1 = x, y1 = y + sd, col = col, angle = 90, length = len) 
} 
x <- barplot(dataxx, offset = 0, ylim=c(0, max(dataxx) * 1.1),axis.lty = 1, names.arg = colnames(dataxx), col = cols, beside = TRUE) 
box() 
legend("topright", legend = rownames(dataxx), fill = cols, box.col = "transparent") 
title(main = "An example of barplot", xlab = "Sample", ylab = "Value") 
sd <- dataxx * 0.1 
for (i in 1:3) {
  plot.error(x[i, ], dataxx[i, ], sd = sd[i, ])
}

image

实例

5.4 二元图

image
matdata <- read.table("plot_observed_species.xls", header=T)
tbl_df(matdata) #查看数据属性和结构
y<-matdata[,2:145]
attach(matdata)
matplot(series,y, 
        ylab="Observed Species Number",xlab="Sequences Number",
        lty=1,lwd=2,type="l",col=1:145,cex.lab=1.2,cex.axis=0.8)
legend("topleft",lty=1, lwd=2, legend=names(y)[1:8], 
       cex=0.5,col=1:145)
detach(matdata)

image

5.5 饼状图

relative<-c(0.270617,0.177584,0.194911,0.054685,0.048903,0.033961, 0.031195,0.188143)
taxon<-c("Sordariales","Pleosporales","Agaricales","Hypocreales",   "Pezizales","Eurotiales","Helotiales","Others")
ratio<-round(relative*100,2)
ratio<-paste(ratio,"%",sep="")
label<-paste(taxon,ratio,sep=" ")
pie(relative,labels=label, main="ITS1-Sample S1",   radius=1,col=rainbow(length(label)),cex=1.3)
library(plotrix)
fan.plot(relative,labels=label,main="Fan plot")
pie3D(relative,labels=label, height=0.2, theta=pi/4, explode=0.1, col=rainbow(length(label)),  border="black",font=2,radius=1,labelcex=0.9)

image

5.6 直方图

seqlength<-rnorm(1000, 350, 30)
hist(seqlength,breaks=100,
     col="red",freq=FALSE, 
     main="Histogram with dengsitycurve",
     ylab="Density", xlab="Sequence length")
lines(density(seqlength),col="blue4",lwd=2)

image

5.7 聚类图

clu <- read.table("unweighted_unifrac_dm.txt", header=T, row.names=1, sep="\t")
head(clu)
dis <- as.dist(clu)
h <- hclust(dis, method="average")
plot(h, hang = 0.1, axes = T, frame.plot = F, main="Cluster Dendrogram based on unweighted_unifrac", sub="UPGMA")

image

5.8 维恩图

library(VennDiagram)
ven<-list(sample1=20:50,  sample2=c(1:30,50:80), sample3=40:90, sample4=c(10:30,70:100))
venn.diagram(ven, filename='venn.png', cex=1.2, col="black", alpha= 0.50,lwd =1.2, cat.cex=1.4,
               fill=c("cornflowerblue", "green", "Gold1","darkorchid1"),  margin=0.15)

image

图片输出

  • 直接导出

    image
  • 命令

pdf(file="file.pdf", width=7, height=10)
png(file="file.png",width=480,height=480)
jpeg(file="file.png",width=480,height=480)
tiff(file="file.png",width=480,height=480)

dev.off()

作者:周运来就是我
链接:https://www.jianshu.com/p/2a1a2ca1a916
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342