文章目录
1 标量、向量、数组、矩阵
- R语言中变量类型称为模式
- 同一向量中的所有元素必须时相同模式
1.1添加或删除向量元素
- R中向量是连续存储的,不能插入或删除元素
- 在R中,向量的大小在创建时已经确定,因此如果想要添加或删除元素,需要重新给向量赋值
例如:
其实,我们为了在其第三和第四元素之间插入一个新的元素168,我们把x的前三个元素、168和x的第四个元素顺序连起来,这样就创建出新的五元向量,但此时x并没有发生变化,接下来再把这个新的向量赋值个x
1.2 获取向量长度
> x <- c(88,5,12,13)
> length(x)
[1] 4
>
1.3 作为向量的矩阵和数组
数组和矩阵(在某种意义上说,甚至包括列表)实际上都是向量,只不过它们还有额外的类属性
这里2*2的矩阵按列存储为一个四元向量,即(1,2,3,4)
2 声明
- R中不需要声明变量
- 如果要引用向量中特定的元素,必须事先告知R
3 循环补齐
> c(1,2,4)+c(6,0,9,20,22)
[1] 7 2 13 21 24
Warning message:
In c(1, 2, 4) + c(6, 0, 9, 20, 22) :
longer object length is not a multiple of shorter object length
> c(1,2,4)+c(6,0,9,20,22)
[1] 7 2 13 21 24
Warning message:
In c(1, 2, 4) + c(6, 0, 9, 20, 22) :
longer object length is not a multiple of shorter object length
> c(1,2,4,1,2)+c(6,0,9,20,22)
[1] 7 2 13 21 24
例子中较短的向量被循环补齐
4 常用的向量运算
4.1向量运算和逻辑运算
4.2 向量索引
- 索引向量的格式:向量1[向量2],返回结果是:向量1中索引为向量2的那些元素
负数的下标代表是把相应的元素删除
4.3 用:运算符创建向量
4.4使用seq()创建向量
- 用来生成等差数列
- seq()还可以处理空向量的问题
for (i in seq(x)) #与for (i in 1:length(x))是等价的
对seq()函数做一个测试
当x为空的时候,循环迭代了0次
4.5 使用rep()重复向量常数
- 可以方便地把同一个常数放在长向量中
- 格式:rep(x,times),即创建times*length(x)个元素的向量
> x <- rep(8,4)
> x
[1] 8 8 8 8
> rep(c(9,8,7),3)
[1] 9 8 7 9 8 7 9 8 7
> rep(1:3,2)
[1] 1 2 3 1 2 3
>
> ##参数each,可以指定x交替重复的次数
> rep(c(5,12,13),each=2)
[1] 5 5 12 12 13 13
5 使用all()和any()
- all()报告参数是否全部为TRUE
- any()报告参数是否至少有一个为TRUE
> x <- 5:10
> any(x>7)
[1] TRUE
> all(x>8)
[1] FALSE
> all(x>4)
[1] TRUE
6 向量化运算符
6.1 向量输入、向量输出
> u <- c(5,2,8)
> v <- c(1,3,9)
> u>v
[1] TRUE FALSE FALSE
> u<v
[1] FALSE TRUE TRUE
>
>
> w <- function(x) return(x+10)
> w(u) #使用了向量化的运算符+,从而w()也是向量化的
[1] 15 12 18
>
> #超越函数----(平方根、对数、三角函数等)也是向量化的
>
> sqrt(1:9)
[1] 1.000000 1.414214 1.732051 2.000000 2.236068
[6] 2.449490 2.645751 2.828427 3.000000
>
> #四舍五入函数:round()
> y <- c(1.2,3.8,0.2)
> round(y)
[1] 1 4 0
>
>
> # +实际上也是函数
>
> y <- c(12,5,13)
> y+4
[1] 16 9 17
> "+"(y,4)
[1] 16 9 17
6.2 向量输入、矩阵输出
> z1 <- function(z) return(c(z,z^2))
> x<-1:8
> z1(x)
[1] 1 2 3 4 5 6 7 8
[9] 1 4 9 16 25 36 49 64
把结果排列成8*2的矩阵,利用matrix
> matrix(z1(x),ncol=2)
[,1] [,2]
[1,] 1 1
[2,] 2 4
[3,] 3 9
[4,] 4 16
[5,] 5 25
[6,] 6 36
[7,] 7 49
[8,] 8 64
>
可以用sapply()来简化。调用sapply(x,f)即可对x的每一个元素使用函数f(),并将结果转化为矩阵
> z1 <- function(z) return(c(z,z^2))
> sapply(1:8, z1)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 1 2 3 4 5 6 7 8
[2,] 1 4 9 16 25 36 49 64
7 NA与NULL值
7.1 NA的使用
- 缺失值:NA
- 不存在的值:NULL
> x <- c(88,NA,12,168,13)
> x
[1] 88 NA 12 168 13
> mean(x) #因为有缺失值,导致mean()无法计算均值
[1] NA
> mean(x,na.rm = T) #na.rm移除NA
[1] 70.25
>
> x <- c(88,NULL,12,168,13)
> mean(x) #R会自动跳过空值NULL!
[1] 70.25
看几个NA值的模式:
> x <- c(5,NA,12)
> x[1]
[1] 5
> mode(x[1])
[1] "numeric"
> mode(x[2])
[1] "numeric"
>
> y <- c("abc","cde",NA)
> y[2]
[1] "cde"
> mode(y[2])
[1] "character"
> mode(y[3])
[1] "character"
7.2 NULL的使用
- 在循环中创建向量
> z <- NULL
> for(i in 1:10)
if(i%%2 == 0) z = c(z,i) # 取余运算
> z
[1] 2 4 6 8 10
求偶数的方法:
> x <- seq(from=2,to=10,by=2)
> x
[1] 2 4 6 8 10
> 2*1:10
[1] 2 4 6 8 10 12 14 16 18 20
- NULL值被作为不存在而不计数
> u <- NULL
> length(u)
[1] 0
> v <- NA
> length(v)
[1] 1
8 筛选
8.1 生成筛选索引
> z <- c(5,2,-3,8)
> z
[1] 5 2 -3 8
> z*z >9 #得到布尔值向量,相当于">"(z*z,8)
[1] TRUE FALSE FALSE TRUE
> w <- z[z*z > 9]
> w
[1] 5 8
举个例子,先定义提取条件,再利用该结果从另一个向量提取子向量:
> z <- c(5,2,-3,8)
> z
[1] 5 2 -3 8
> z*z >9 #得到布尔值向量
[1] TRUE FALSE FALSE TRUE
> w <- z[z*z > 9]
> w
[1] 5 8
8.2 使用subset()函数筛选
- subset可以移除NA
> w <- c(1,6,3,NA,2,10)
> w
[1] 1 6 3 NA 2 10
> w[w>5]
[1] 6 NA 10
> #利用subset()函数
> subset(w,w>5)
[1] 6 10
8.3 选择函数which()
- 找到z中满足条件元素所在的位置
- 可以找到TRUE
> x <- c(3,2,1,-4,8)
> which(x*x>10)
[1] 4 5
可以利用which()函数改善寻找第一次出现数字1的案例
> first5 <- function(x){
+ return(which(x==1)[1])
+ }
> first5 <- function(x){
+ return(which(x==1)[1])
+ }
> x<-c(3,4,1,7,19,1)
> first5(x)
[1] 3
>
9 向量化的ifelse()函数
- 格式:ifelse(b,u,v)。b是一个布尔值,u和v是向量
- 该函数返回值也是向量,如果b[i]为真,则返回值的第i个元素为u[i],如果b[i]为假,则返回值的第i个元素为v[i]
> x <- c(6,5,8,9,2,1,3)
> ifelse(x>4,x*5,x*10)
[1] 30 25 40 45 20 10 30
10 测试向量相等
- 最朴素的方法:==
- all()函数会询问其所有元素是否为真
> x <- 1:3
> y <- c(1,3,4)
> all(x == y)
[1] FALSE
- identical函数判断的是两个对象是否完全一样
> x <- 1:3
> y <- c(1,3,4)
> identical(x,y)
[1] FALSE
但是一种情况:
> x <- 1:3 #:产生的是整数
> y <- c(1,2,3) #产生的是浮点数
> identical(x,y)
[1] FALSE
> typeof(x)
[1] "integer"
> typeof(y)
[1] "double"
11 向量元素的名称
- 给向量的元素命名
- 查询向量元素的名称,可以用名称来引用向量中的元素
> x <- c(1,4,5)
> names(x)
NULL
> names(x) <- c("a","b","c")
> names(x)
[1] "a" "b" "c"
> x
a b c
1 4 5
> x["a"]
a
1
> x["c"]
c
5