文章目录

  • 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 向量元素的名称


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 作为向量的矩阵和数组

数组和矩阵(在某种意义上说,甚至包括列表)实际上都是向量,只不过它们还有额外的类属性

R语言 Z标准化 r语言向量标准化_运算符


这里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向量运算和逻辑运算

R语言 Z标准化 r语言向量标准化_r语言_02

4.2 向量索引

  • 索引向量的格式:向量1[向量2],返回结果是:向量1中索引为向量2的那些元素
  • R语言 Z标准化 r语言向量标准化_运算符_03

  • 负数的下标代表是把相应的元素删除
  • R语言 Z标准化 r语言向量标准化_r语言_04


4.3 用:运算符创建向量

R语言 Z标准化 r语言向量标准化_数组_05

4.4使用seq()创建向量

  • 用来生成等差数列
  • R语言 Z标准化 r语言向量标准化_运算符_06


  • seq()还可以处理空向量的问题
for (i in seq(x)) #与for (i in 1:length(x))是等价的

对seq()函数做一个测试

R语言 Z标准化 r语言向量标准化_数组_07


当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