参考资料:https://www.bilibili.com/video/BV19x411X7C6?p=17
(17-19)
一、向量(17)
- 概念
vector:R中的一个重要概念,构成其他数据结构的基础。同数学中向量有些许不同,类似数学上集合的概念,由一个或多个元素所构成。
向量其实是用于存储数值型、字符型或逻辑型数据的一维数组。
- 向量创建
函数:c(concatenate连接/collect收集/combine合并)
例如:
<x <- c(1,2,3,4,5)
<y <- c("one","two","three")//千万注意加引号!!!
<z <- c(TRUE,T,F)//TRUE全部都要大写,不能仅仅首字母大写
<c(1:100)//用冒号构成等差数列,生成1~100的等差数列
<seq (from-1,to-100)//设置等差值
<seq (from-1,to-100,by=2)//设置等差为2
<seq (from-1,to-100,length.out = 10)//length.out控制元素个数
<rep(2,5)//rep设置重复序列,此处为重复5次2
<rep(x,5)//重复x 5次
<rep(x,each=5)//设置每个元素重复的次数,可见下图
<rep(x,each=5,times=2)//each和time一起使用
向量的元素必须为同一个类型,要么都是数值,要么都是字符串,要么都是逻辑型。不能混合
3.向量化编程
例如,一个简单的计算
> x <- c(1,2,3,4,5)
> y <- c(6,7,8,9,10)
> x*2+y
[1] 8 11 14 17 20
由此便可以避免循环,提高效率,为向量化编程最大的优势。
再例如
>rep(x,c(2,4,6,1,3))//即可让x中每个元素重复不同的次数
[1] 1 1 2 2 2 2 3 3 3 3 3 3 4 5 5 5
二、向量索引(18)
- 访问向量中的元素
(1) 正(负)整数索引(根据元素在集合中的位置来访问)
例如:
>x <- c(1:100)
>x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
[37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
[55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
[91] 91 92 93 94 95 96 97 98 99 100
> length(x)
[1] 100
> x[1]
[1] 1
>x[-19]//不访问19位元素
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
[37] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
[55] 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
[73] 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
[91] 92 93 94 95 96 97 98 99 100
>x[c(4:18)]//输出4-18个元素
[1] 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
>y <- c(1:10)
>y
>y[c(T,F,T,T,F,F,T,T,T,F)]
[1] 1 3 4 7 8 9
>y[c(T)]
[1] 1 2 3 4 5 6 7 8 9 10
>y[c(T,F,T,T,F,F,T,T,T,F,T,F)]
[1] 1 3 4 7 8 9 NA
#NA为缺失值
>y[y>5]
[1] 6 7 8 9 10
>y[y>5 & y<9]
[1] 6 7 8
(2) 逻辑向量索引
>z <- c("one","two","three","four","five")
>"one" %in% z//元素是否在向量中
>z["one" %in% z]
[1] "one" "two" "three" "four" "five"
>z[z %in% c("one","two")]
[1] "one" "two"
>z %in% c("one","two")
[1] TRUE TRUE FALSE FALSE FALSE
>k <- z %in% c("one","two")
>z[k]
[1] "one" "two"
(3) 名称索引
>names(y)
NULL
>names(y) <- c("one","two","three","four","five","six","seven","eight","nine","ten")
>y
one two three four five six seven eight nine ten
1 2 3 4 5 6 7 8 9 10
>names(y)
[1] "one" "two" "three" "four" "five" "six" "seven" "eight" "nine"
[10] "ten"
例如,在访问大的数据集时
>euro
ATS BEF DEM ESP FIM FRF
13.760300 40.339900 1.955830 166.386000 5.945730 6.559570
IEP ITL LUF NLG PTE
0.787564 1936.270000 40.339900 2.203710 200.482000
>euro["ATS"]
ATS
13.7603
在后面学习到数据框时,就可以使用列名来访问这一列向量
- 修改向量
(1) 添加向量
#在上面的实验中,x为一个1~100等差数列的向量
>x[101] <- 101
>x
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
[37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
[55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
[91] 91 92 93 94 95 96 97 98 99 100 101
批量赋值:
>v <- 1:3
>v[c(4,5,6)] <- c(4,5,6)
>v
若定义v[20] <- 4,未被赋值的元素为NA缺失值
>v[20] <- 4
> v
[1] 1 2 3 4 5 6 NA NA NA NA NA NA NA NA NA NA NA NA NA 4
#若想在某一位添加值
>append(x = v,values = 99,after = 5)//在第五位后面插入值99
[1] 1 2 3 4 5 99 6 NA NA NA NA NA NA NA NA NA NA NA NA NA 4
(2)删除向量
①删除整个向量
rm(v)
②删除向量中某个元素
>y[-c(1:3)]
four five six seven eight nine ten
4 5 6 7 8 9 10
>y <- y[-c(1:3)]
>y
four five six seven eight nine ten
4 5 6 7 8 9 10
(3)修改向量
修改某一个值
>y["four"] <- 100
> y
four five six seven eight nine ten
100 5 6 7 8 9 10
但是要注意数据类型,是字符串还是数值或是其他
例如:
> v
[1] 1 2 3 4 5 6 NA NA NA NA NA NA NA NA NA NA NA NA NA 4
> v[2] <- "one"
#v就会变成字符串向量
> v
[1] "1" "one" "3" "4" "5" "6" NA NA NA NA NA NA
[13] NA NA NA NA NA NA NA "4"
三、向量运算(19)
- 加(+)、减(-)、乘(*)、除(/)、求余(%%)、整除(%/%)
在计算时,当y的长度小于x的长度的时候,会自动填充使得两个向量长度相等,向量长度不相等时最后一个向量自动和第一个向量相加。且只有长的向量元素个数必须是短元素数量元素的整倍数才可进行运算。
- 逻辑运算
eg. x>5,x>y...
>c(1,2,3) %in% c(1,2,2,4,5,6)
[1] TRUE TRUE FALSE
比较两个向量是否相等时,应该使用两个等号,一个等号相当于是赋值操作
- 常用向量运算函数
数学函数:
abs(x):返回向量x的绝对值
sqrt(x):计算平方根
log(16,base = 2):计算以2为底数,16的对数
exp(x):计算x向量每个元素的指数
取整:
ceiling(x):向上取整,返回不小于x的最小整数
floor(x):返回不大于x的最大整数
trunc(x):返回整数部分
round(x):用来进行四舍五入
以上四个函数都是用来取整,需要注意其中的区别
signif(x):保留小数部分有效数字
三角函数:
sin(x) cos(x) tan(x)
>x <- -5:5
> x
[1] -5 -4 -3 -2 -1 0 1 2 3 4 5
> abs(x)
[1] 5 4 3 2 1 0 1 2 3 4 5
>sqrt(x)
[1] NaN NaN NaN NaN NaN 0.000000 1.000000 1.414214
[9] 1.732051 2.000000 2.236068
>sqrt(25)
[1] 5
> log(16,base = 2)
[1] 4
>log(16)//不加任何参数,默认是自然对数
[1] 2.772589
>log10(10)
[1] 1
> exp(x)
[1] 6.737947e-03 1.831564e-02 4.978707e-02 1.353353e-01 3.678794e-01
[6] 1.000000e+00 2.718282e+00 7.389056e+00 2.008554e+01 5.459815e+01
[11] 1.484132e+02
>ceiling(c(-2.3,3.1415))
[1] -2 4
> floor(c(-2.3,3.1415))
[1] -3 3
> trunc(c(-2.3,3.1415))
[1] -2 3
> round(c(-2.3,3.1415))
[1] -2 3
> round(c(-2.3,3.1415),digits = 2)
[1] -2.30 3.14
> signif(c(-2.3,3.1415))
[1] -2.3000 3.1415
统计函数:(对整体数据处理,返回一个值)
sum(x):
max(x):
min(x):
range(x):返回最大值和最小值
mean(x):返回向量均值
var(x):返回向量方差
sd(x):返回标准差
prod(x):返回向量连乘的积
median(x):返回中位数
quantile(x,c(a,b,c)):计算分位数(计算不同分位数)
which.max(x):返回最大值的位置(索引值)
which(x==a):返回该值的位置