30分钟掌握R语言编程基础
R语言是世界上最广泛使用的统计编程语言。本文的目的是使得读者快速上手R语言编程。
1 R语言概述
R语言是世界上最广泛使用的统计编程语言。有人认为,它是数据科学家的第一选择(人生苦短,我选Python),并由一个充满活力和有才华的贡献者(包括Hansen老师)社区支持。
R语言综合档案库CRAN(The Comprehensive R Archive Network) 包含了大量开发者贡献的扩展包,截至2020年5月30日,总共有15707个包,涉及统计分析、数值计算、量化投资、金融分析、数据挖掘、机器学习、生物信息学、生物制药、全球地理科学、数据可视化等各个领域。
2013年以来,R包的数量以每月以3.9%的速度快速增长(下图是Hansen老师从CRAN上爬取的最新数据,并用ggplot2
绘制)。
R语言作为一门编程语言是非常容易入门的,但想深入掌握R语言,必须具备基础的数学知识,主要包括初等数学,高等数学,线性代数,概率论,统计学等。
2 环境设置
从R语言官方网址https://cran.r-project.org/ 下载最新版本的R语言解释器。然后下载一个IDE(集成开发环境),R有专门的IDE,即Rstudio,这应该是大家最常用的。微软的Visual Studio,VS code也可以配置R语言编程环境,我自己多年来一直在用Visual Studio。另外 jupter,Pycharm也支持R语言的开发,力推Pycharm,同时支持R与python在一个环境中使用。
3 R对象的类型
尽管R对象有多种类型,但经常使用的是:
向量(vector)
列表(list)
矩阵(matrix)
数组(array)
因子(factor)
数据框(data.frame)
x = pi*10^2 #pi是圆周率
class (x) #x的class
typeof (x) #x的type
3.1 标量 scalar
最简单的R数据类型是标量,主要有6种:逻辑型logical(TRUE,FALSE)、数值型numeric(1.22)、整型integer(12)、字符型character("good","bad","叫爸爸")、原型raw(48 65 6c 6c 6f)、复数complex(4i+1)。
最常用的是前四种。
3.2 向量 vector
向量是用于存储数值型、字符型、逻辑型元素的集合,向量是1维的,同一向量中无法混杂不同类型的元素。
在R中,向量是R的最基本的数据类型。
向量化计算是R语言特有的一种并行计算方式,即当你对一个向量进行操作时,程序会对向量中每个元素进行分别计算,计算结果以向量的形式返回。向量化计算,在R中有很广泛的应用场景,基本可以取代循环计算,高效的完成计算任务。
使用c()函数将元素组合成向量。
y = c(1,3,7,3,4,2)
x = 1:100#把1,2,..., 100个整数向量赋值到x
sample(x, 20) #从中随机不放回地抽取20个值作为样本
set.seed(0)
sample(1:100,20)#先设随机种子再抽样
#从1,. . . ,200000中随机不放回地抽取10000个值作为样本:
z = sample(1:200000,10000)
z[1:10]#方括号中为向量z的下标
y = c(1,3,7,3,4,2)
z[y] #以y为下标的z的元素值
z = sample(x, 100, rep=TRUE) #从有放回地随机抽取100个值作为样本
print(z)
zl = unique(z)
print(zl)
length(zl)#z中不同的元素个数
xz = setdiff(x,z) #和名之间的不同元素--集合差
sort(union(xz, z)) #对xz及z的并的元素从小到大排序
setequal(union(xz, z) ,x) #xz及z的并的元素与x是否一样
intersect(1:10,7:50) #两个数据的交
sample(1:100,20,prob=1:100) #从1:100 中不等概率随机抽样, 各数目抽到的概率与1:100成比例
(z=seq(-1, 10, length=100) ) #-1 到 10 等间隔的 100 个数的序列
z=seq(-1, 10, len=100) #和上面等价写法
(z=seq(10,-1,-0.1)) #10到-1 间隔为-0.1 的序列
(x=rep(1:3,3)) #三次重复1:3
(x=rep(3:5,1:3)) #自己看,这又是什么呢?
x=rep(c(1,10) ,c(4,5))
w=c(1,3,x,z) ;w[3]#把数据(包括向量)组合(combine)成一个向量
x=rep(0,10);
z=1:3;x+z #向量加法(如果长度不同,R如何给出警告和结果
x*z #向量乘法
rev(x)#颠倒次序
z=c("no cat", "has ", "nine", "tails") #字符向量
z[1]== "no cat"#双等号为逻辑等式
z=1:5
z[7]=8;
z #什么结果?注:NA为缺失值(not available)
z = NULL
z[c(1,3,5)]=1:3;
z = rnorm(10)[c(2,5)]
z[-c(1,3)]#去掉第1、3元素
z=sample(1:100,10);
z
which(z==max(z))#给出最大值的下标
which.max(z)
与向量有关的函数
函数 | 含义 |
---|---|
min(x) | 最小值 |
max(x) | 最大值 |
which.min(x) | 显示最小值所在位置 |
which.max(x) | 显示最大值所在位置 |
sum(x) | 加和 |
length(x) | x的长度 |
mean(x) | 均值 |
median(x) | 中值 |
var(x) | 方差 |
sd(x) | 标准差 |
sqrt(x) | 平方根 |
abs(x) | 取绝对值 |
unique(x) | 去冗余 |
intersect(x) | 取交集 |
union(x,y) | 取并集 |
setdiff(x,y) | 差集 |
setequal(x,y) | 判断两向量是否相同(对顺序无要求) |
identical(x,y) | 判断两向量是否相同(对顺序有要求) |
3.3 列表 list
list可以是任何对象(包括list本身)的集合。
z = list(1:3,m=c(1:2,a=list ("R",letters [1:5]),w="hi!"))
z[[1]]
z[[2]]
z$m
z$m$a2
z$m[[3]]
z$m$w
3.4 矩阵 matrix
矩阵是2维数的,同一矩阵中也无法混杂不同类型的元素
x=matrix(1:20,4,5);x #矩阵的构造
x=matrix (1:20,4,5, byrow=TRUE) ;
x#矩阵的构造,按行排列
t(x) #矩阵转置
x=matrix(sample(1:100,20),4,5)
2*x
x+5
y=matrix(sample(1:100,20),5,4)
x+t(y)#矩阵之间相加
(z=x%*%y) #矩阵乘法
zl = solve(z) # solve(a,b)可以解ax=b方程
#应该是单位向量,但浮点运算不可能得到干净的0
round (zl%*%z, 14) #四舍五入
b=solve(z,1:4);
b #解联立方程
nrow(x) ;ncol(x) ;dim(x)#行列数目
x=matrix(rnorm(24),4,6)
x[c(2,1),]# 第2和第 1行
x[,c(1,3)] #第1 和第3列
x[2,1] #第[2,1]元素
x[x[,1]>0,1] #第1列大于0的元素
sum(x[,1]>0) #第1列大于0的元素的个数
sum(x[,1]<=0) #第1列不大于0的元素的个数
x[,-c(1,3)]#没有第1、3列的x.
diag(x) #x的对角线元素
diag(1:5) #以1:5为对角线,其他元素为0的对角线矩阵
diag(5) #5维单位矩阵
x[-2,-c(1,3)] #没有第2行、第1、3列的x
x[x[,1]>0 & x[,3]<= 1,1] #第1列>0并且第3列<2的第1列元素
x[x[,2]>0 | x[,1]<0.51,1]#第[列<0.51或者第2列>0的第1列元素
x[!x[,2]<0.51,1]#第1列中相应于第2列中>=0.51的元素
apply (x, 1, mean) #对行(第一维)求均值
apply (x, 2, sum)#对列(第二维)求和
x=matrix(norm(24) ,4,6)
x[lower.tri(x) ] = 0;
x #得到上三角阵,
#为得到下三角阵,用
x[upper.tri(x)] = 0
3.5 高维数组 array
矩阵限制为二维,数组可以具有任何数量的维度。
x=array(runif(24),c(4,3,2))
x#从24个均匀分布的样本点构造4乘3乘2的三维数组
is.matrix(x)
dim(x) #得到维数(4,3,2)
is.matrix(x [1,,] )#部分三维数组是矩阵
x=array(1:24,c(4,3,2))
x[c(1,3),,]
x=array(1:24,c(4,3,2))
apply (x,1, mean) #可以对部分维做均值运算
apply(x,1:2,sum) #可以对部分维做求和运算
apply(x,c(1,3), prod) #可以对部分维做求乘积运算
3.6 数据框 Data Frames
数据框也是二维的表格数据对象。与矩阵的不同在于,其每列可以包含不同的数据类型。数据框可以看做是等长度的向量的列表。
install.packages("creditmodel")
library(creditmodel)
class(UCICreditCard) #UCICreditCard 是credtimodel包默认数据集
typeof(UCICreditCard) #UCICreditCard的type
str(UCICreditCard) # 查看UCICreditCard的数据结构
names(UCICreditCard) #UCICreditCard数据的变量名字
summary (UCICreditCard) #UCICreditCard 的汇总
head(UCICreditCard)#UCICreditCard的头几行数据,和UCICreditCard[1:6,]相同
tail(UCICreditCard) #UCICreditCard的最后几行数据
row.names(UCICreditCard) #行名字
4 数据的输入和输出
r支持各种格式数据文件,如excel\csv\txt\spss\sas\stata\netcdf\hdf5等。但最为方便的还是csv或txt文件,将数据文件放到工作目录直接读取。
第一步:设置工作目录,注意路径要用反斜杠"/"或者双斜杠"\\":
setwd("C:/work")
第二步:使用creditmodel
包的read_data函数读取数据
library(creditmodel)
#读取一个文件
raw_dat = read_data("query-hive-366149.csv", encoding = "UTF-8")
#读取多个文件
raw_dat_list = read_data(path = getwd(), "query-hive", encoding = "UTF-8")
raw_dat_1 = raw_dat_list[1]
raw_dat_2 = raw_dat_list[2]
第三步:使用creditmodel
包的save_data函数保持数据到工作目录
#保存一个文件
save_data(raw_dat)
#保存多个文件
save_data(raw_dat_1, raw_dat_2 )
未完待续......