- 1 标量、向量、数组、矩阵
- 1.1添加或删除向量元素
- 1.2 获取向量长度
- 1.3 作为向量的矩阵和数组
- 2 声明
- 3 循环补齐
- 4 常用的向量运算
- 4.1向量运算和逻辑运算
- 4.2 向量索引
- 4.3 用:运算符创建向量
- 4.4使用seq()创建向量
- 4.5 使用rep()重复向量常数
- 5 使用all()和any()
- 6 向量化运算符
- 6.1 向量输入、向量输出
- 6.2 向量输入、矩阵输出
- 7 NA与NULL值
- 7.1 NA的使用
- 7.2 NULL的使用
- 8 筛选
- 8.1 生成筛选索引
- 8.2 使用subset()函数筛选
- 8.3 选择函数which()
- 9 向量化的ifelse()函数
- 10 测试向量相等
- 11 向量元素的名称
- R语言中变量类型称为模式
- 同一向量中的所有元素必须时相同模式
- R中向量是连续存储的,不能插入或删除元素
- 在R中,向量的大小在创建时已经确定,因此如果想要添加或删除元素,需要重新给向量赋值
例如:
其实,我们为了在其第三和第四元素之间插入一个新的元素168,我们把x的前三个元素、168和x的第四个元素顺序连起来,这样就创建出新的五元向量,但此时x并没有发生变化,接下来再把这个新的向量赋值个x
> x <- c(88,5,12,13) > length(x) [1] 4 >1.3 作为向量的矩阵和数组
数组和矩阵(在某种意义上说,甚至包括列表)实际上都是向量,只不过它们还有额外的类属性
这里2*2的矩阵按列存储为一个四元向量,即(1,2,3,4)
- 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的那些元素
负数的下标代表是把相应的元素删除
- 用来生成等差数列
- seq()还可以处理空向量的问题
for (i in seq(x)) #与for (i in 1:length(x))是等价的
对seq()函数做一个测试
当x为空的时候,循环迭代了0次
- 可以方便地把同一个常数放在长向量中
- 格式: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 135 使用all()和any()
- all()报告参数是否全部为TRUE
- any()报告参数是否至少有一个为TRUE
> x <- 5:10 > any(x>7) [1] TRUE > all(x>8) [1] FALSE > all(x>4) [1] TRUE6 向量化运算符
6.1 向量输入、向量输出
> u <- c(5,2,8) > v <- c(1,3,9) > u>v [1] TRUE FALSE FALSE > u6.2 向量输入、矩阵输出> > 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
> 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] 18 筛选
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 88.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 108.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 3010 测试向量相等
- 最朴素的方法:==
- 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



