1、R语言介绍

R和RStudio 是与计算机进行对话的两个工具
RStudio 是话筒
R是沟通所用的语言
R的由来:基于S语言,由新西兰奥克兰大学的Robert Gentleman和Ross Ihaka开发,因两位开发者名字首字母都是R,所以该语言命名为R。
怎样理解R
一种计算机语言
一种用于统计分析、绘图的操作环境
用户接口
R 语言特点
R 是一款开源、免费的软件,可以跨平台运行
R 提供了非常丰富的统计分析技术
有很多非常实用并包含最新技术的R包,而且更新速度非常快
R的绘图功能十分强大

 软件界面:

R语言基础-风君雪科技博客

 配置文件,选择SDI单窗口

R语言基础-风君雪科技博客

 选择save进行直接保存修改,不需要更改路径

 R语言基础-风君雪科技博客

 效果图:

R语言基础-风君雪科技博客

 R环境下的提示符:

R语言基础-风君雪科技博客R语言基础-风君雪科技博客

 2、R包的安装

 R语言基础-风君雪科技博客

 下载包:

R语言基础-风君雪科技博客

 查看所有包的命名:

(.packages(all=T))

R语言基础-风君雪科技博客

 加载包命令:

# 使用下载后的包首先得加载包
#library(cjava)

 没有任何提示表示结果正常

输入错误按Esc键重新输入 

取消命令:ctrl+c

向量的长度=向量的个数

字符串向量,双引号 “ ”

c函数:拼接功能

同时下载两个包

install.packages(c("reshape2","dplyr"))

创建R对象 

R语言区分大小写

 对象sz

<-赋值符号

1:6数值

sz<-1:6

 R语言基础-风君雪科技博客

 连续赋值:

R语言基础-风君雪科技博客

 ls()函数调取所有对象

 get()函数得到变量的数值

删除对象:

R语言基础-风君雪科技博客

 删除所有对象

rm(list=ls())

统计函数

sum()

R语言基础-风君雪科技博客

sz+1:2

R语言基础-风君雪科技博客

 R语言基础-风君雪科技博客

sz+1:4

R语言基础-风君雪科技博客

 R语言基础-风君雪科技博客

元素方式运算

R使用元素执行方式运算的机制:匹配向量,独立操作每对元素
如果两个向量长度不等,R会在较短的向量上重复
以上这种行为在R中被称为向量循环,帮助R执行元素方式运算
矩阵乘法:当需要使用矩阵乘法时,需要做出专门的请求
计算向量的内积:sz %*% sz
计算向量的外积:sz %o% sz
转置:t()
计算矩阵的行列式:det()

sz*sz 平方运算

sz%*%sz  一行一列

R语言基础-风君雪科技博客

 R语言基础-风君雪科技博客

 sz%o%sz

R语言基础-风君雪科技博客

 R语言基础-风君雪科技博客

c(2,5,6,8)%o%c(3,7)

R语言基础-风君雪科技博客

 R语言基础-风君雪科技博客

项目一:

R语言基础-风君雪科技博客

用sample()函数,抽取1:6的随机数,抽取两次

sample函数可以完成随机抽样处理,其基本形式为:
sample(x, size, replace = FALSE)

replace=False 表示不可放回抽样

 

 用replicate()函数执行100次

R语言基础-风君雪科技博客

 replace=TRUE/replace=T可放回抽样

R语言基础-风君雪科技博客

 基于名称的传参和基于位置的传参

R语言基础-风君雪科技博客

基于位置的传参必须严格按照位置顺序,否则出错

自定义函数————调用函数

 R语言基础-风君雪科技博客

 练习:重复执行10次郑色子,得到10个点数和

 首先自定义函数,再调用函数

R语言基础-风君雪科技博客

 直接调用前面定义的函数

R语言基础-风君雪科技博客

 修改函数fix(函数名)

R语言基础-风君雪科技博客R语言基础-风君雪科技博客

 传参处理:

R语言基础-风君雪科技博客

 生成等差数列函数seq

seq(...)

## Default S3 method:
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
    length.out = NULL, along.with = NULL, ...)

seq.int(from, to, by, length.out, along.with, ...)

seq_along(along.with)
seq_len(length.out)

R语言基础-风君雪科技博客

 输出9个

R语言基础-风君雪科技博客

 伴随向量:

R语言基础-风君雪科技博客

生成步长为1的等差数列

 

 乘方运算

R语言基础-风君雪科技博客

 绘制一个散点图:两个变量的关系

R语言基础-风君雪科技博客

 R语言基础-风君雪科技博客

直方图

直方图的横纵坐标都是连续的,强调的是数值连续的变化规律,可以表示两个变量
> x<-c(1,2,3,3,3)
> x
[1] 1 2 3 3 3
> qplot(x)

R语言基础-风君雪科技博客

 qplot(x,binwidth=1)

R语言基础-风君雪科技博客

当次数够多满足正态分布

zn<-replicate(10000,zsz(sk=1:6))
> qplot(zn,binwidth=1)

R语言基础-风君雪科技博客

# 入样概率 prob控制概率

R语言基础-风君雪科技博客

> zsz
function(sk){

skn<-sample(sk,size=2,replace=T,prob=c(1/8,1/8,1/8,1/8,1/8,3/8))
sum(skn)
}

> zn<-replicate(10000,zsz(sk=1:6))
> qplot(zn,binwidth=1)

R语言基础-风君雪科技博客

#添加入样概率,6点概率是其他点数概率的3倍
function(sk=1:6){
skn<-sample(sk,size=2,replace=T,prob=c(1,1,1,1,1,3))
sum(skn)
}

向量的循环:

> rep(1:3,times=3)
[1] 1 2 3 1 2 3 1 2 3
> rep(1:3,each=3)
[1] 1 1 1 2 2 2 3 3 3
> rep(1:3,times=c(1,3,2))
[1] 1 2 2 2 3 3
> 

字符串连接函数paste

paste()

其中...表示一个或多个R可以被转化为字符型的对象;参数sep表示分隔符,默认为空格;

R语言基础-风君雪科技博客

项目二-设计扑克牌模拟系统

要求:自动洗牌、发牌
任务一:创建一副牌。学会如何使用R的数据类型和数据结构。
任务二:编写发牌和洗牌的函数。学习从一个数据集中抽取想要的数值。
任务三:改变点数系统。学习在数据的内部改变数据的取值
任务四:管理扑克牌的状态。学习R的环境系统和作用域规则。

原子型向量

数据结构:数据结构是存储、组织数据的方式,是数据内部的构成方法。
原子型向量:R里面最简单的数据类型,是构成其他对象类型的基本元素。
原子型向量的特点:每个原子型向量都将一种类型的数据存储在一个一维向量中。
原子型向量的分类: 双整型:存储普通的数值型数据;
> x1<-c(1,2,3,4,5,6)
> x1
[1] 1 2 3 4 5 6
> is.vector(x1)
[1] TRUE
> length(x1)
[1] 6
> typeof(x1)
[1] "double"

整型:存储整型的数据;
> int<-c(-1L,2L,4L)
> int
[1] -1  2  4
字符型:存储文本型数据;
逻辑型:用来存储TRUE和FALSE这两个布尔数据。
> logic<-c(TRUE,FALSE)
> logic
[1]  TRUE FALSE
> typeof(logic)
[1] "logical"
复数型和原始类型:分别来存储复数和数据的原始字节。
is.vector():查看某个对象是否为向量。
typeof():查看某个对象的数据类型

R语言基础-风君雪科技博客

 #练习:生成一个原子型向量,来存储同花顺的牌面

同一种花色的顺子,比如黑桃的 A 、 K 、 Q 、 J 、 10 

R-属性

属性:附加给原子型向量的额外信息。
attributes():查看一个对象包含哪些属性信息。
原子向量最常见的三种属性:名称、维度和类。每种属性都有自己的辅助函数。
练习1:给骰子的每个点数命名,并查看。
命名向量:
> kl<-c(a=1,b=2)
> kl
a b 
1 2 

关于维度:dim()函数可以将一个原子型向量转换为一个n维数组。
> dim(sz)<-c(2,3)
> sz
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> 

练习2:将一个向量转换为矩阵,并查看数据排列方式。
dim(sz)<-c(2,3,3)2行3列,切片3
练习3:用matrix()函数创建矩阵。
3行2列
R语言基础-风君雪科技博客

 2行3列

 R语言基础-风君雪科技博客

练习4:用array()函数创建数组。

2行3列,4个切片
R语言基础-风君雪科技博客
typeof():查看某个对象的数据类型

R–类

类:新的结构,新的格式。
class():查看一个对象的类。
练习1:赋予向量以维度属性,观察其class属性的变化。
用属性系统表示更多的数据类型:日期时间与因子。
日期与时间:R用一个特殊的类来表示日期和时间数据。
POSIXct:一个被广泛用于表示日期与时间的框架。
R处理规则:R函数在显示该对象之前,会根据POSIXct标准将该时间转换为用户可以理解的字符串。
练习2:用Sys.time()函数查看当前系统时间,并查看该对象的类和类型。
> Sys.time()
[1] "2019-12-05 21:37:24 CST"
> now<-Sys.time()
> now
[1] "2019-12-05 21:37:57 CST"
练习3:用unclass()函数移除对象的class属性。
> now
[1] "2019-12-05 21:37:57 CST"
> class(now)
[1] "POSIXct" "POSIXt" 
> typeof(now)
[1] "double"
> unclass(now)
[1] 1575553078
> #练习:1970年1月1日零点之后的100万秒是哪一天?
> mil<-1000000
> class(mil)<-c("POSIXct","POSIXt")
> mil
[1] "1970-01-12 21:46:40 CST"

R–因子

因子:存储分类信息。
R中因子生成机制:R会将向量中的值重新编码为一串整数值,再将编码的结果存储在一个整型向量中,
然后对其添加一个levels属性和一个class属性。其中levels属性包含显示因子值的一组标签。
练习1:用factor()函数创建一个因子。 练习2:用as.character()函数将一个因子强制转换为字符串。
问题:当在原子型向量中存储多种类型的数据会发生什么问题呢?

integer整型向量

> xb<-factor(c("female","male","male","female"))
> xb
[1] female male   male   female
Levels: female male
> class(xb)
[1] "factor"
> typeof(xb)
[1] "integer"
> as.numeric(xb)
[1] 1 2 2 1

强制转换

R强制转换所遵循的规则:
如果一个原子型向量包含字符串,R会将该向量中的所有元素都转换成字符型。
如果一个原子型向量只包含逻辑型和数值型元素,R会将逻辑型全部转换成数值型。
原因:单一数据类型的好处:数据操作更加直接和高效;而且就变量而言,变量中每个值度量的都是相同的属性,
因此没有必要使用不同的数据类型。
R语言基础-风君雪科技博客

 NA表示缺失值

 

R语言基础-风君雪科技博客

> mn<-c("","","")
> mn
[1] "" "" ""
> sum(mn=="")
[1] 2
> sum(mn=="")
[1] 1
> sum(mn=="")/sum(mn)
Error in sum(mn) : 'type'(character)参数不对
> sum(mn=="")/sum(mn!="")
[1] 0.6666667
> sum(mn=="")/length(mn)
[1] 0.6666667
> sum(mn=="")/sum(c(mn=="",mn==""))
[1] 0.6666667
> mean(mn=="")
[1] 0.6666667

列表

列表:将数据组织在一个一维集合中。与原子型向量的区别在于,列表并不是将某些具体的值组织起来,而是组织R对象。
练习:用list()函数创建一个列表
[[]]:表示来自列表的哪一个元素。
双索引系统:因为列表的元素可以是任意一种R对象。
列表的特点:R中全能型的存储工具。

下面最外层的list有三个元素

R语言基础-风君雪科技博客

 命名:

R语言基础-风君雪科技博客

 二维表

> data.frame(姓名=c("张三","李四"),成绩=c(100,90))
  姓名 成绩
1 张三  100
2 李四   90

数据框

数据框:列表的二维版本。将向量组织在一个二维表格中,每一个向量作为这个表格一列。
需要注意的问题:
不同的列可以包含不同的数据类型;
每一列必须具有相同的长度;
每个向量都有自己的名称;
stringsAsFactors参数应设置为FALSE。
练习:用data.frame()函数创建一副牌。
> data.frame(姓名=c("张三","李四"),成绩=c(100,90))->df
> df
  姓名 成绩
1 张三  100
2 李四   90
> typeof(df)
[1] "list"
stringsAsFactors=F
> data.frame(姓名=c("张三","李四"),成绩=c(100,90),stringsAsFactors=F)->df
> df
  姓名 成绩
1 张三  100
2 李四   90
> str(df)
'data.frame':   2 obs. of  2 variables:
 $ 姓名: chr  "张三" "李四"
 $ 成绩: num  100 90

 RStudio设置

R语言基础-风君雪科技博客R语言基础-风君雪科技博客

#项目二-构建一副扑克牌
pkp<-data.frame(pm=rep(c("A",2:10,"J","Q","K"),times=4),
                hs=rep(c("红桃","黑桃","梅花","方块"),each=13),
                ds=rep(1:13,times=4),
                stringsAsFactors = F)
str(pkp)

#查看pkp的前六条数据
head(pkp)
R语言基础-风君雪科技博客
#查看pkp的前八条数据
head(pkp,n=8)
#查看pkp的后六条数据
tail(pkp)
#查看当前的工作目录
getwd()
#设置工作目录
setwd("C:UsersDesktopDT")

# 写入外部文件
write.csv(pkp,file = "puke.csv",row.names = F)
# 小结
# 第一个角度:从数据类型的角度
#数据类型相同的,向量、矩阵、数组
#数据类型不同的:列表、数据框

# 第二个角度
#一维结构:向量、矩阵
#二维结构:矩阵、数据框
#三维或三维以上结构:数组

选中要运行的代码,执行运行

R语言基础-风君雪科技博客

 R语言基础-风君雪科技博客

# 必知必会的函数
#whichwhich.max()which.min()

# which:返回一个逻辑向量里面真值所在位置

which(c(T,F,T))
man<-c("","","")

# 计算向量里面男生所在位置
which(man=="")

# which.max():返回一个向量里面最大值所在位置
which.max(c(3,4,7))


# which.min():返回一个向量里面最大值所在位置
which.min(c(3,4,7))

# 排序
# 第一种:直接排序
x<-c(7,5,8,9,2)
sort(x)
x<-sort(x)

#降序排序
sort(x,decreasing = T)

# 第二种:间接排序
order(x)

#第三种:倒着排
rev(x)

 练习:

# 作业:编写一个函数,具有如下功能:
# 1.输入参数为一个向量
# 2.计算向量的均值、方差、标准差、中位数
# 3.计算向量的标准化得分
# 4.将2与3中的计算结果存储到一个列表中作为函数返回对象
f<-function(x){
  mean<-mean(x)
  var<-var(x)
  sd<-sd(x)
  median<-median(x)
  zscore<-(x-mean(x))/sd(x)
  lst<-list(f.mean=mean,f.var=var,f.sd=sd,f.median=median,f.zscore=zscore)
  lst
}

f(c(1,3,5,7,9))

$f.mean
[1] 5

$f.var
[1] 10

$f.sd
[1] 3.162278

$f.median
[1] 5

$f.zscore
[1] -1.2649111 -0.6324555
[3]  0.0000000  0.6324555
[5]  1.2649111