R语言—90分钟从入门到精通
1. 初识R
1.1 安装R
Step1
. 打开官网 The R Project for Statistical Computing
Step2
. 点击download R
Step3
. 选择镜像
Step4
. 选择你所需的R版本,在此以Windows为例
Step5
. 点击install R for the first time.
Step6
. 进入下载界面,出现最新版本下载,也可以在该页面跳转到下载历史版本,这里我们下载最新的版本R-3.6.0
Step7
.打开下载下来的应用程序,如下图:
Step8
:双击后,按照提示操作,最终安装到默认目录下C:\Program Files\R\R-3.6.0,当然,你也可以放在其他目录。此时,在你的桌面会有带有R图标的软件,双击打开,进入R控制台。
如上,我们已经下载了R软件,可以通过任务栏h中文件=>新建程序脚本打开进入到编辑界面,在此我们可以编写R代码,如下:我们运行了一段代码,并输出结果3。
#在R中“=”表示赋值,“#”表示注释
a=1 #将1赋值给a
b=2 #将2赋值给b
c=a+b #将a加b的结果赋值给c
c #打印出c的结果
1.2 R编辑器-Rstudio安装
Step1
. RStudio是R软件的编译器,它让用户交互体验更好,点击RStudio下载链接。
Step2
. 下载后,运行RStudio-1.2.1335.exe
Step3
. 安装后,打开编辑器。
Step4
. 认识RStudio并新建R脚本
File->New File->R script 创建R scrip,输入以下代码,查看运行结果,可以看到console控制台输出运行结果。
getwd() #查看保存文件的路径
a=1 #将1赋值给a
b=2 #将2赋值给b
c=a+b #将a加b的结果赋值给c
c #打印出c的结果
1.3 更换镜像/安装包/帮助文档
1.3.1 更换镜像
# 使用代码改变镜像,将镜像赋值给r['CRAN']
local(
{
r <- getOption("repos")
r["CRAN"] <- "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"
options(repos=r)
})
或采用界面方式更改镜像
- 打开Tools->Global Options->Packages
- 在Package Management-Primary CRAN repository更改镜像文件,点击确认。
1.3.2 安装包
# 利用代码安装包
install.packages("ggplot2")
#调用包
require(ggplot2)
#或
library(ggplot2)
#假设装包失败,可以试图换一个镜像,更换地址:https://cran.r-project.org/mirrors.html
或者利用界面安装包
1.3.3 查看帮助文档
# help(package="packagename")
# help(packagename)
library(ggplot2)
help(package="ggplot2")
help(ggplot2)
或者
1.4 常见读取文件方式
1.5 R链接数据库
2. 常见的数据类型及其转换
2.1 几种常见的数据类型
数据类型-Ch | 数据类型-En | 样例 |
---|---|---|
数值型 | numeric | 1,2,3 |
逻辑型 | logical | TRUE Or FALSE |
字符型 | character | “little tree” |
因子型 | factor |
举例说明:
#======class查看数据所属的类型===
class(data.frame(1,2,3))
[1] "data.frame"
class(TRUE)
#[1] "logical"
class("beautiful code")
#[1] "character"
class(1)
#[1] "numeric"
class(as.factor(1))
#[1] "factor"
#======mode查看对象存储模式==
mode(data.frame(1,2,3,4))
#[1] "list"
mode(TRUE)
#[1] "logical"
mode("beautiful code")
#[1] "character"
mode(as.factor(c(1,2,3)))
#[1] "numeric"
以上对比可知,class(data.frame(1,2,3,4))
得到数据所属类型是数据框,mode(data.frame(1,2,3,4))
则是list
,说明数据框存储模式是以list
存储的,所以数据框是特殊的数列。
2.2 检查数据类型
#=========is.***()======
is.integer(1.3)
#[1] FALSE
is.double(3)
#[1] TRUE
is.factor(89)
#[1] FALSE
is.numeric(2.3)
#[1] TRUE
is.logical(TRUE)
#[1] TRUE
is.logical("TRUE")
#[1] FALSE
is.complex(9i)
#[1] TRUE
2.3 强制数据类型转换
#===as.***()=====
as.numeric("8")
#[1] 8
as.logical(8)
#[1] TRUE
as.character(8)
#[1] "8"
as.factor("8")
#[1] 8
#Levels: 8
2.4 特殊的数据类型
NULL
:空数据
NA
:表示无数据
NaN
:表示非数字
inf
:数字除以0得到的值
以上分别用is.null()
、is.na()
、is.nan()
、is.infinite()
查看是否是该种数据。
3. 数据结构
3.1常见的几种数据结构
数据结构-Ch | 数据结构-En | 样例 | 数据类型一致 |
---|---|---|---|
数据框 | Data.frame | head(iris) | 否 |
向量 | vector | c(1,2,3,4) | 是 |
列表 | list | list(list(1,2,3,4),list(‘a’,‘b’)) | 否 |
数组 | matrix | matrix(1:12,ncol=3) | 是 |
其中,data.frame这种数据类型在我们之后的例子中会反复出现。
3.2 函数
函数一般包括:函数名
、参数
和程序主体
。
#======函数一般表现形式:Func<-function(){...}====
#一、下面定义了函数可以实现平方计算,return返回输出值,
myfun=function(x){y=x*x;return(y)}
a<-myfun(4)
a
#>[1] 16
#二、若无输出值,默认为最后一行返回结果
myf=function(x){y=x*x; y}
myf(2)
#>[1] 4
#三、若最后一行无返回结果,那么函数将无返回结果
myf=function(x){y=x*x}
myf(2)
#>
3.3 对象
R是一种基于对象(object)的语言,所以我们在R语言中看到的一切事物
都是对象,向量
是对象,函数
是对象,图形
是对象。
简单说,我们可以把一辆奥迪车看做是R对象(object)
,奥迪车里有很多零部件,如方向盘、油门、刹车、座椅,所有的这些事物都是对象。而这些方向盘、油门、刹车则各有不同的属性(如方向盘尺寸、大小、颜色等属性),类也是其中一种属性。
4. 句法结构
4.1 if 条件判断语句
if条件判断语句,用来执行满足给定条件的语句.
一般形式如下:
if(con1){
…
}else if(con2){
…
} else {
…}
用if条件判断语句实现功能-以Pima- Indians- diabetes印度糖尿病数据集为例,为检验指定变量是否显著影响糖尿病发病问题。我们对该Pima- Indians- diabetes数据集中怀孕次数做了方差检验,但方差检验必须满足2个条件:
- 数据服从正态分布
- 方差的齐次性
Pima- Indians- diabetes
数据集见引文文章末尾[附录1],或
链接: https://pan.baidu.com/s/1iNYZA3TWr8Qsn24uciedqA 提取码: nahe
数据变量说明:
# Number of times pregnant 怀孕次数
# Plasma glucose concentration a 2 hours in an oral glucose tolerance test 口服葡萄糖耐受试验中,2小时的血浆葡萄糖浓度。
# Diastolic blood pressure (mm Hg) 舒张压(mm Hg)
# Triceps skin fold thickness (mm) 三头肌皮肤褶层厚度(mm)
# 2-Hour serum insulin (mu U/ml) 2小时血清胰岛素含量(μU/ ml)
# Body mass index (weight in kg/(height in m)^2) 体重指数(体重,kg /(身高,m)^ 2)
# Diabetes pedigree function 糖尿病家族史
# Age (years) 年龄(岁)
# Class variable (0 or 1) 类变量(0 或 1)
#########分析各解释变量与因变量之间的关系################
#将Pima-Indians-diabetes.txt放在某文件夹中,然后修改下面的路径获取数据
diabetes=read.table("E:\\2019\\分享\\LearningR\\Pima- Indians- diabetes.txt",header = FALSE,sep=',',stringsAsFactors = FALSE)
colnames(diabetes)<-c("PregntCnt","Pla_glus","bloodPressure","Triceps","insulin","massIndex","function","Age","Class")#给数据列命名
head(diabetes)
summary(diabetes)#查看数据整体情况
nrow(diabetes)#查看行数
diabetes$Class<-as.factor(diabetes$Class)#将分类变量因子化
#显著检验:1.正态检验通过-->齐次性检验-->通过,oneway.test-->不通过,用anova.lm
# 2.正态检验不通过--->kruskal.test
shapiro<-shapiro.test(diabetes[,1])
if(shapiro$p.value<0.05){
bartlett_result<-bartlett.test(diabetes[,1],diabetes$Class)
if (bartlett_result$p.value<0.05){
oneway<-oneway.test(diabetes[,1]~diabetes$Class) #方差不齐次采用oneway.test检验
p<-oneway$p.value
F<-oneway[1]$statistic
}else{
anov<-anova(lm(diabetes[,1]~diabetes$Class))#方差齐次采用anova检验
p<-anov$`Pr(>F)`
F<-anov$`F value`
}
}else {p<-kruskal.test(diabetes[,1]~diabetes$Class)}
####运行结果
>p
#[1] 7.618009e-05
> F
# F
#16.52915
4.2 for循环
p<-c()
F<-c()
for(i in 1:(ncol(diabetes)-1)){
if(shapiro$p.value<0.05){
bartlett_result<-bartlett.test(diabetes[,i],diabetes$Class)
if (bartlett_result$p.value<0.05){
oneway<-oneway.test(diabetes[,i]~diabetes$Class) #方差不齐次采用oneway.test检验
p[i]<-oneway$p.value
F[i]<-oneway[1]$statistic
}else{
anov<-anova(lm(diabetes[,i]~diabetes$Class))#方差齐次采用anova检验
p[i]<-anov$`Pr(>F)`
F[i]<-anov$`F value`
}
}else {p[i]<-kruskal.test(diabetes[,i]~diabetes$Class)}
}
result<-data.frame(variable=colnames(diabetes[,1:8]),p,F)
> result
# variable p F
# 1 PregntCnt 7.618009e-05 16.529151
# 2 Pla_glus 8.416627e-15 68.781816
# 3 bloodPressure 4.986853e-02 3.885661
# 4 Triceps 2.007306e-01 1.646236
# 5 insulin 4.140004e-03 8.500660
# 6 massIndex 8.490817e-08 30.575634
# 7 function 1.793037e-03 9.975887
# 8 Age 9.086480e-07 25.443602
作业1:将上述 for 循环改成函数,函数名为myTest
4.3 while循环
#-----while循环的一般形式:
while(cond1){
…}
# 1. 设定初始值
n=0
i=1
# 2. while循环体
while(i<100){
print(i)
n=n+i
i=i+1 }
# 3. 实现从1加到99
print(n)
4.4 Switch语句
R中的switch语句和其他的语句有很大区别
·
####C语言中switch语句语法:
switch(expr){
case constant-expression:
statement(s);
break;
case constant-expression:
statement(s);
break;
####R语言中switch语句语法:
switch(expr,list)
其中,expr为表达式,其值或者为字符串或者为数值;
list为一个列表
# (1) 当expr为数值时,表示list的位置,当数值超过list长度,返回空值
switch(2, "翔宇亭IT乐园", "百度百家号", "R语言学习")
# [1] "百度百家号"
switch(5, "翔宇亭IT乐园", "百度百家号", "R语言学习")
# (2) 当expr为字符串,有点类似于键值对{key:words},expr相当于输入key,找对应的words
switch('fruit', drink="water", meat = "beef", fruit = "apple", vegetable="cabbage")
# [1] "apple"
5. R与数据产品
工作中,老板往往不仅限让你去分析数据,得到结论。而更多的是让你从分析问题的角度出发,思考怎样将这种分析思路转换成更通用化、更便于理解和使用的产品。并且,将这些产品展示出来。于是,工业界就诞生了数据产品这一职能。
事实上,一位出色的数据科学家一定程度上也扮演者上述的角色。所以,接下来要介绍的就是R与数据产品。
6. 简单介绍R与机器学习
R有很多用于机器学习的包
聚类算法
中主成分分析、kmeans、DBSCAN、层次分析法;分类算法
中KNN、SVM、决策树、随机森林、XGBOOST等;深度学习
中MXNetR、darch、deepnet、H2O、deepr包等;自然语言
处理中Rwordseg是最常见的分词包;
此外,R还可以用于爬虫
等其他技术领域。
这里我们重点讲聚类算法中的kmeans以及分类算法中C5.0