vlambda博客
学习文章列表

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 )


未完待续......