![7f4b0e56969cf499388de244d53644fa.png](https://i-blog.csdnimg.cn/blog_migrate/9534d5328e4fcb9c29acd476c7140051.jpeg)
向量
R语言是向量化编程,基本类型(atomic)是向量类型,包括一些内置函数都是向量化操作,是对每个元素进行运算的,如基本的加法运算:如果两个向量长度相等,则对应元素相加,如果不等,则短的元素向长的补齐
> x1 <- c(1,2,3)
> x2 <- c(2,3,4)
> x1 + x2
[1] 3 5 7
> x3 <- c(4,5,6)
> x3 <- c(4,5,6,6)
> x3 + x1 #如果长向量长度不是短向量的长度,则会发出警告消息
[1] 5 7 9 7
Warning message:
In x3 + x1 :
longer object length is not a multiple of shorter object length
> x3 <- c(4,5,6,6,6,6)
> x3 + x1#如果长向量长度是短向量的长度整数倍
[1] 5 7 9 7 8 9
其他数据类型都是在向量基础上衍生出来的,比向量多了几个属性,如矩阵多了dim属性
一、创建向量及其op:
#生成向量
x <- c(1,2,3)
> y <- NULL
> y[1] <- 10
> y[2] <- 20
> y
[1] 10 20
NA值和NA值是不同的,NULL值是不存在,常用于节省内存生成向量,NA是值存在,但是不知道是多少,一般很多函数的操作对象有NA值时都无法运算,需要提供参数选项忽略掉这些NA值
向量常用的一些函数:不懂的函数可以用help(函数名)or ?函数名 查看帮助文档
#获取向量长度
> length(x)
[1] 3
#向量的索引,切片,x[],[]内部
可以是start:stop切片,不同于python,R语言下标起始于1,且切片包括最后一个元素:
> y <- c(1,10,20,5,45,23)
> y[1:3]
[1] 1 10 20
:这个也可以直接用来生成向量:
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
也可以是一个表示索引的向量:索引可以重复
> y[c(1,1,2,4)]
[1] 1 1 10 5
不同于python,负数索引表示从列表的末尾开始,而R中负数索引代表排除这个索引对应的元素在外
> y[-c(1,1,2,4)]
[1] 20 45 23
#seq函数
> seq(12,30)
[1] 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
这里还有很多参数,如by表示间隔
#seq函数还有一个用处,如果直接是一个向量,seq可以简接生成一个该向量对应的索引
> seq(y)
[1] 1 2 3 4 5 6
#rep
> rep(8,4)
[1] 8 8 8 8
> rep(c(1,2,3),4)
[1] 1 2 3 1 2 3 1 2 3 1 2 3
> rep(c(1,2,3),each=4)
[1] 1 1 1 1 2 2 2 2 3 3 3 3
each参数,控制每个元素的次数,如果没有,则按照整体处理
二、向量化编程
> u <- c(5,2,8)
> v <- c(1,3,9)
> u>v
[1] TRUE FALSE FALSE
一般内置的函数都是逐个元素处理
在R中自定义函数也是默认输入参数是向量类型
> f <- function(x,c){return ((x+c)^2)}
> f(1:3,1:3)
[1] 4 16 36
可以看到x,c果然是北大当作向量处理了
如果想把输入限制为标量,需要加一些判断语句
> f <- function(x,c){
if(length(x)!=1) stop("vector c not allowed")
return ((x+c)^2)
}
三、NA与NULL
NA是存在的,但是不知道数值,所以是元素,而NULL不是元素
>n <- NULL
>length(n)
0
>m <- NA
>1
内置函数必须有na.rm = T才能参与运算,否则结果为NA
NULL一般用于循环中创建向量,减少内存的使用,因为做到了”用则开发空间“
四、向量的筛选
1.简单的布尔向量索引筛选
> y
[1] 1 10 20 5 45 23
> y[y>10]
[1] 20 45 23
2.subset()函数筛选,这个函数的好处是自动过滤NA值
> x
[1] 1 3 5 NA
> subset(x,x>3)
[1] 5
3.which()函数,which函数返会的是布尔索引
> which(y>10)
[1] 3 5 6
> y[which(y>10)]
[1] 20 45 23
五、ifelse()函数,这个函数对应与普通的版本,普通的if-else结果只能应对判断语句是标量的情况下
> x <- c(5,2,9,12)
> if(x>6)
+ {
+ x <- 2*x
+ }
Warning message:
In if (x > 6) { :
the condition has length > 1 and only the first element will be used
判断语句x>6实际上有多个元素,会报错
改用ifelse语句
> ifelse(x>6,2*x,3*x)
[1] 15 6 18 24
六、向量元素的名称以及降级
向量元素是可以有名称,这样就可以通过元素对应的名称访问
> x
[1] 5 2 9 12
> names(x) <- c("a","b","c","d")
> x
a b c d
5 2 9 12
由于向量要求每个元素同类型,当遇到不同类型的时候,会自动进行类型转换,转化为当前最低级别的,如果有character类型在,则一律转换为character
类型的
> c(5,2,"ddas")
[1] "5" "2" "ddas" #全转换为character类型的
> c(1,2,3,c(1,2,3))#不同于python,这种语句并不是嵌套语句,在R中一般向量类型不存在嵌套语句,不同于python,但R中list是存在嵌套的结构的
并且由于list存在嵌套结构,单个[],和[[]]访问得到的结果是不一样的
[1] 1 2 3 1 2 3
矩阵和数组:(主要是矩阵,数组大同小异)
一、创建矩阵及其op
> m <- matrix(c(1,2,3,4),nrow = 2,ncol = 2)#指定一个也行,另一个默认自动计算,byrow=T or F
> m
[,1] [,2]
[1,] 1 3
[2,] 2 4
Operation:
矩阵运算:%*%
> m <- matrix(c(1,2,3,4),nrow = 2,ncol = 2)
> m
[,1] [,2]
[1,] 1 3
[2,] 2 4
> n <- matrix(c(1,2,3,4),nrow = 2,ncol = 2,byrow = T)
> n
[,1] [,2]
[1,] 1 2
[2,] 3 4
> m * n
[,1] [,2]
[1,] 1 6
[2,] 6 16
矩阵索引,在python中,用:表示对应维度所有的元素,在R中,如果取某一维度所有的元素,则该维度不需要填:
x[,c(1,2],表示所有行,1,2列
> n[,2]
[1] 2 4
可以对取出的值进行赋值,会修改原矩阵
矩阵元素筛选同向量,不在叙述
apply()函数的运用
apply函数可以对矩阵的某一行或某一列进行映射,apply函数家族还有很多,具体的可以用到的时候再查
删除矩阵的行或列
矩阵的维度是确定的,所有没有确定的函数可以进行这样的操作,但是可以对原矩阵赋值,达到修改矩阵shape的效果,
rbind,cbind可以分别按行结合,按列结合形成新的矩阵
矩阵本质就是一个向量,只是多了2个属性,行和列,所有可以对矩阵应用一系列的向量的函数,如length
(提示:输入函数名,可以看到对应函数体)
colnames()和rownames()可以分别对矩阵的列和行定义名字
有的时候对矩阵取子集,会引起意外的降维,导致类型转换
所以在用索引的时候,可以加一个drop=F选项,x[2,,drop = F]
高维数组
相当于把多个矩阵,或者比矩阵更高维的数据类型合并在一起,如下,f1,f2是2个矩阵,合并在一起,但是为什么不直接合并2个矩阵呢,c(f1,f2),这样得到的结果只是一个向量,前面已经说过,向量是没有内嵌套结构的,所以合并后产生的还是向量。
定义方式:array(data=c(f1,f2),dim=c(3,2,2))