(windows安装安装路径不要出现中文,不然RStudio找不到R软件)
1、R中的数据结构
1.1向量,标量
1.2矩阵
1.3数组
1.4列表
1.5数据框
1.6因子
1.7时间序列
2、R语言基础
2.1运算符
R 语言赋值使用的是左箭头 <- 符号,不过一些新版本也支持等号=,也可以用->符号(最新版本)。
2.2变量的定义
R 语言的有效的变量名称由字母,数字以及点号 . 或下划线 _ 组成。
变量名称以字母或点开头。
注意:首字母为“.”点,或者英文字母,“.”号后面不能直接跟数字
demo
> var.1 = c(0,1,2,3) > print(var.1) [1] 0 1 2 3 > var.2 = c("Hello","R") > print(var.2) [1] "Hello" "R" > var.3 <= c("Hello","Java") 错误: 找不到对象'var.3' #符号错误 <= 应该是 <- > var.3 <- c("Hello","Java") > print(var.3) [1] "Hello" "Java" > c(true,1)->var.4 错误: 找不到对象'true' #布尔值大小写敏感 > c(TRUE,1) -> var.4 > print(var.4) [1] 1 1 >
列出已定义的变量ls()函数
> var.1 = c(0,1,2,3) > var.2 = c("Hello","R") > var.3 <- c("Hello","Java") > c(TRUE,1) -> var.4 > print(ls()) [1] "var.1" "var.2" "var.3" "var.4" >
删除变量可以使用rm()函数
> print(ls()) [1] "var.1" "var.2" "var.3" "var.4" > rm(var.1) > print(ls()) [1] "var.2" "var.3" "var.4" >
linux中进入和退出R软件
[root@VM-0-3-centos ~]# R R version 3.6.0 (2019-04-26) -- "Planting of a Tree" Copyright (C) 2019 The R Foundation for Statistical Computing Platform: x86_64-redhat-linux-gnu (64-bit) R是自由软件,不带任何担保。 在某些条件下你可以将其自由散布。 用'license()'或'licence()'来看散布的详细条件。 R是个合作计划,有许多人为之做出了贡献. 用'contributors()'来看合作者的详细情况 用'citation()'会告诉你如何在出版物中正确地引用R或R程序包。 用'demo()'来看一些示范程序,用'help()'来阅读在线帮助文件,或 用'help.start()'通过HTML浏览器来看帮助文件。 用'q()'退出R. > q() Save workspace image? [y/n/c]: n
运行R脚本,在命令窗口使用Rscript来执行该脚本
#linux 创建编辑脚本文件 并运行脚本文件 [root@VM-0-3-centos zxgtest]# touch test.R [root@VM-0-3-centos zxgtest]# vim test.R [root@VM-0-3-centos zxgtest]# Rscript test.R [1] 1 2 3 4 5
2.3、常见的函数
输入输出print()函数
> print("Hello R!") [1] "Hello R!" >
拼接cat()函数
> cat("张三","今年",18,"岁",'\n') 张三 今年 18 岁 >
cat()函数输出到文件中,append=TRUE输出到文件中不覆盖,追加到后面
> cat("输出到文件中",file="/zxgtest/test.txt") > cat("追加数据不覆盖之前文件数据",file="/zxgtest/test.txt",append=TRUE)
sink() 函数可以把控制台输出的文字直接输出到文件中去:
> sink("/zxgtest/sinkfile.txt") #这样会将控制台输出的数据全部存储到指定的文件中,控制台不输出数据,显然这不是我们需要的效果 #split=TRUE 可以实现既将控制台输出的文件保存到文件中,又在控制台显示 > sink("/zxgtest/sinkfile.txt",split=TRUE) #如果想取消输出到文件,可以调用无参数的 sink : >sink()
readLines() 从文件中读入数据
# 当前工作目录 print(getwd()) # 设置当前工作目录 setwd("/zxgtwst/test2") # 查看当前工作目录 print(getwd())
3、R语言两种注释方式
3.1、单行注释 #
# 变量赋值 a <- 9
3.2、多行注释"
if(TRUE) { " 这是一个多行注释的实例 注释内容放在单引号或双引号之间 " }
4、基础运算
优先级 | 符号 | 含义 |
1 | () | 括号 |
2 | ^ | 乘方运算 |
3 | %% | 整除求余 |
%/% | 整除 | |
4 | * | 乘法 |
/ | 除法 | |
5 | + | 加法 |
- | 减法 |
> 1 + 2*3 [1] 7 > (1+2)*3 [1] 9 > 3 / 4 [1] 0.75 > 3.4-1.2 [1] 2.2 > 1 -4 * 0.5 ^ 3 [1] 0.5 > 8 / 3 %% 2 [1] 8 > 8 / 4 %% 2 [1] Inf > 3 %% 2^2 [1] 3 > 10 / 3 %/% 2 [1] 10
关系运算符(> < == != >= <=)
> v <- c(2,4,6,9) > t <- c(1,4,7,9) > print(v>t) [1] TRUE FALSE FALSE FALSE > print(v < t) [1] FALSE FALSE TRUE FALSE > print(v == t) [1] FALSE TRUE FALSE TRUE > print(v!=t) [1] TRUE FALSE TRUE FALSE > print(v>=t) [1] TRUE TRUE FALSE TRUE > print(v<=t) [1] FALSE TRUE TRUE TRUE >
逻辑运算
运算符 | 描述 |
& | 元素逻辑与运算符,将第一个向量的每个元素与第二个向量的相对应元素进行组合,如果两个元素都为TRUE则记过为TRUE,否则为FALSE |
| | 元素逻辑或运算符,将第一个向量的每个元素与第二个向量的相对应元素进行组合,如果两个元素中有一个为TRUE,则结果为TRUE,如果都为FALSE,则返回FALSE |
! | 逻辑非运算符,返回向量每个元素相反的逻辑值,如果元素为TRUE则返回FALSE,如果元素为FALSE则返回TRUE |
&& | 逻辑与运算符,只对两个向量对一个元素进行判断,如果两个元素都为TRUE,结果为TRUE,否则为FALSE |
|| | 逻辑或运算符,只对两个向量,对第一个元素进行判断,如果两个元素中一个为TRUE,则结果为TRUE,如果都为FALSE则返回FALSE |
> v = c(3,1,TRUE,2+3i) > t = c(4,1,FALSE,2+3i) > print(v&t) [1] TRUE TRUE FALSE TRUE > print(v|t) [1] TRUE TRUE TRUE TRUE > print(!t) [1] FALSE FALSE TRUE FALSE > p = c(3,0,TRUE,2+2i) > k = c(1,3,TRUE,2+3i) > print(p&&k) [1] TRUE > print(p||k) [1] TRUE #&&和||只对第一个元素进行比较
赋值运算符
运算符 | 描述 |
<-、=、<<- | 向左赋值 |
->、->> | 向右赋值 |
其他运算符
运算符 | 描述 |
: | 冒号运算符,用于创建一系列数字的向量 |
%in% | 用于判断元素是否再向量里,返回布尔值,有的话返回TRUE,没有的话返回FALSE |
%*% | 用于矩阵与它转置的矩阵相乘 |
> v <- 1:10 #1到10的向量 > print(v) [1] 1 2 3 4 5 6 7 8 9 10 > s = c(1,2,3) > print(s) [1] 1 2 3 > v1 = 3 > v2 = 20 > print(v1 %in% v) #判断数字是否再向量v中 [1] TRUE > print(v2 %in% v) [1] FALSE > M = matrix(c(2,6,5,1,10,4),nrow = 2,ncol = 3,byrow = TRUE)#矩阵与它置换的矩阵相乘 > t = M %*% t(M) > print(t) [,1] [,2] [1,] 65 82 [2,] 82 117 >
常用数学函数
函数 | 说明 |
sqrt(n) | n的平方根 |
exp(n) | 自然常数e的n次方 |
log(m,n) | m的对数函数,返回n的几次方等于m |
log10(m) | 相当于log(m,10) |
> sqrt(4) [1] 2 > sqrt(16) [1] 4 > exp(1) [1] 2.718282 > exp(2) [1] 7.389056 > log(2,4) [1] 0.5 > log10(10000) [1] 4 > log(10,100) [1] 0.5 >
取整函数
名称 | 参数模型 | 含义 |
round | (n) | 对n四舍五入取整 |
round | (n,m) | 对n保留m位小数四舍五入 |
ceiling | (n) | 对n向上取整 |
floor | (n) | 对n向下取整 |
> round(1.5) #round函数谨慎使用,有时5也会舍去 [1] 2 > round(2.5) [1] 2 > round(3.5) [1] 4 > round(4.5) [1] 4
数学运算 三角函数、反三角函数
> sin(pi/6) [1] 0.5 > cos(pi/4) [1] 0.7071068 > tan(pi/3) [1] 1.732051 > asin(0.5) [1] 0.5235988 > acos(0.7071068) [1] 0.7853981 > atan(1.732051) [1] 1.047198 #下面几个都是正态分布的函数,名字以norm结尾,代表“正态分布” #前缀 d 概率密度函数 # p 概率密度积分函数(从无穷小到x的积分) # q 分位数函数 # r 随机数函数(常用于概率仿真) > dnorm(0) [1] 0.3989423 > pnorm(0) [1] 0.5 > qnorm(0.95) [1] 1.644854 > rnorm(3,5,2) #产生3个平均值为5,标准差为2的正态随机数 [1] 1.351745 5.329550 2.958539
R 语言除了含有正态分布函数以外还有泊松分布 (pois, Poisson) 等常见分布函数 --------“概率论与数理统计”
注意:个位数字为4的话round函数
5、数据类型(数字、逻辑、文本)
数字常量:一般型、科学计数法
逻辑类型:常量值只有 TRUE和FALSE 区分大小写。
对象类型:(向量、列表、矩阵、数组、因子、数据框)
下面详细介绍详细介绍对象类型
5.1、向量(Vector)
最常见的是二维向量,在平面坐标系中必然会用到。(可以看作java中的数组)。
c()是创造向量的函数。
向量中的每个元素可以通过下标单独取出。(下标代表的第几个,起始值为1)(java等其他语言中的下标基本上从0开始)
注意:二维向量和其他维度的向量运算失去数学意义,会出现警告。
> a=c(1,2,3,6,11,25,64,126) > a[4] [1] 6 #通过下标获取单独的值 > a[1:4] [1] 1 2 3 6 #获取1到4的值 > a[c(1,3,6)] [1] 1 3 25 #获取1,3,6位置的值 > a[c(-1,-3)] [1] 2 6 11 25 shuchu 64 126 > #去掉1,3位置的值,并输出向量
向量支持标量运算
> c(1.1,1.2,1.3) - 0.5 [1] 0.6 0.7 0.8 > a = c(1,2,4) > a ^ 2 [1] 1 4 16
常用的数学运算函数也适用向量运算 sqrt、exp、sort、rev、order
> a = c(1,3,5,2,4,6) > sort(a) [1] 1 2 3 4 5 6 > rev(a) [1] 6 4 2 5 3 1 > order(a) [1] 1 4 2 5 3 6 > a[order(a)] [1] 1 2 3 4 5 6 #order(a) 函数为排序后a向量的下标
R中有完善的统计函数
sum、mean(求平均值)、var(方差)、sd(标准差)、min(最小值)、max(最大值)、range(取值范围)(二维向量最大值和最小值)
> sum(1:10) [1] 55 > sd(1:10) [1] 3.02765 > range(1:10) [1] 1 10
向量生成,生成等差数列,可以用seq函数
> seq(1,9,2) [1] 1 3 5 7 9 > seq(1,8,2) [1] 1 3 5 7#seq(a,b,c) 从a到b,步长为c> seq(1,2,length.out=3) [1] 1.0 1.5 2.0 # 从m到n数列的长度为3 > rep(0, 5) [1] 0 0 0 0 0 #重复数字0 5次
向量中常会用到NA和NULL,介绍与区别
NA代表的缺失,NULL代表的不存在
NA缺失就像占位符,代表这里没有一个值,但位置存在
NULL代表的就是数据不存在
> length(c(NA, NA, NULL)) [1] 2 > c(NA, NA, NULL, NA) [1] NA NA NA #NULL在R向量中没有任何意义
which比较罕见的向量逻辑型处理函数
> c(1,2,3) > 2 [1] FALSE FALSE TRUE > a = c(1,2,3)>2 > b = c(1,2,3) > print(a) [1] FALSE FALSE TRUE > print(b) [1] 1 2 3 > which(a) [1] 3 > b = c(1,2,3,4,5,6) > which(a) [1] 3 > a = b >2 > which(a) [1] 3 4 5 6 > vector = c(10,40,78,64,53,62,69,70) > print(vector[which(vector >= 60 & vector < 70)]) [1] 64 62 69 > #从一个线性表中筛选大于等于 60 且小于 70 的数据 类似的函数还有any() all() 等 > all(c(TRUE,TRUE,TRUE)) [1] TRUE > all(c(TRUE,FALSE,TRUE)) [1] FALSE > any(c(TRUE,FALSE,FALSE)) [1] TRUE > any(c(FALSE,FALSE,FALSE)) [1] FALSE
5.2、字符串(常用的对字符串操作的函数)
> toupper("Hello R") #转换为大写 [1] "HELLO R" > tolower("Hello R") #转换为小写 [1] "hello r" > nchar("汉字",type="bytes") #统计字节长度 [1] 6 > nchar("中文",type="byte") [1] 6 > nchar("汉字",type="char") #统计字符数 [1] 2 > substr("unbelievable",1,5) #截取字符串,从1到5 [1] "unbel" > substring("unbelievable",5) #截取字符串,从5到结束 [1] "lievable" > as.numeric("24") #将字符串转化为数字 [1] 24 > as.character(12.34) #将数字转化为字符串 [1] "12.34" > strsplit("hello_java_learn_R","_") #分隔符拆分字符串 [[1]] [1] "hello" "java" "learn" "R" > gsub("/","-","2021/08/21") #替换字符串 [1] "2021-08-21" >
R支持perl语言格式的正则表达式
5.2、矩阵
> vector = c(1,2,3,4,5,6) > matrix(vector,2,3) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6<br>#初始化内容是由一个向量来传递的,其次要输入矩阵有多少行多少列 > vector = c(1,2,3,4,5) > matrix(vector,2,3) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 1 Warning message: In matrix(vector, 2, 3) : 数据长度[5]不是矩阵行数[2]的整倍<br>#当初始化向量数量不足时会给出警告 > vector = c(1,2,3,4,5,6) > matrix(vector,2,3,byrow=TRUE) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6<br>#按行来初始化矩阵 > matrix(vector,2,3,byrow=FALSE) [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6<br>#按列初始化矩阵 > m1 = matrix(vector,2,3,byrow=FALSE) > m1[1,1] [1] 1 > m1[1,2] [1] 3<br>直接访问矩阵的具体元素 > colnames(m1) = c("x","y","z") > rownames(m1) = c("a","b") > m1 x y z a 1 3 5 b 2 4 6 > #设置行列的名称,这个过程通过字符串向量批量完成#通过设定的名称访问具体的元素<br>
> m1["b",] x y z 2 4 6 > m1["b","a"] Error in m1["b", "a"] : 下标出界 > m1["a","x"] [1] 1 > m1["b","y"] [1] 4
矩阵的运算
> m1 = matrix(c(1,2,3,4),2,2) > m2 = matrix(c(5,6,7,8),2,2) > m1%*%m2 [,1] [,2] [1,] 23 31 [2,] 34 46<br>#矩阵的乘法运算 > A = matrix(c(1,2,3,4),2,2) > solve(A) [,1] [,2] [1,] -2 1.5 [2,] 1 -0.5<br>#逆矩阵 > A [,1] [,2] [1,] 1 3 [2,] 2 4 > apply(A,1,sum) [1] 4 6<br>8 > apply(A,2,sum) [1] 3 7