之前我在R-数据科学(一):数据结构中初步介绍了向量的定义和类型以及对于向量的简单操作,如向量中的元素选取等,但是还有许多常用且相对复杂的操作并未提及,这篇文章的目就是详细的介绍我在学习过程中遇到的所有关于向量的操作。
1 向量的创建
创建空向量
c()
## NULL
创建字符型向量
color = c('blue','yellow','red')
names(color) = c('col1','col2','col3') # 命名
color
## col1 col2 col3
## "blue" "yellow" "red"
创建数值型向量:
1:4
## [1] 1 2 3 4
c(1:4)
## [1] 1 2 3 4
c(1,2,3,4)
## [1] 1 2 3 4
seq()
函数和 rep()
函数创建特殊向量
# 指定间隔生成向量
seq(2,6, by = 0.5)
## [1] 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0
# 重复向量
rep(1:4,2)
## [1] 1 2 3 4 1 2 3 4
# 重复向量中每个元素
rep(c('a','b','c'),each = 3)
## [1] "a" "a" "a" "b" "b" "b" "c" "c" "c"
append()
函数在现有向量后面添加向量
a = 2:5
a1 = append(a, 1:10, length(a))
a1
## [1] 2 3 4 5 1 2 3 4 5 6 7 8 9 10
2 向量的操作
2.1 选择向量中的元素
示例向量:
x = 1:10
names(x) = paste('name', 1:10, sep = '')
x
## name1 name2 name3 name4 name5 name6 name7 name8 name9 name10
## 1 2 3 4 5 6 7 8 9 10
通过位置选择
x[1]
## name1
## 1
x[-1]
## name2 name3 name4 name5 name6 name7 name8 name9 name10
## 2 3 4 5 6 7 8 9 10
x[2:4]
## name2 name3 name4
## 2 3 4
x[-(2:4)]
## name1 name5 name6 name7 name8 name9 name10
## 1 5 6 7 8 9 10
x[c(2,4)]
## name2 name4
## 2 4
根据值选择向量
x[x == 10]
## name10
## 10
x[x > 5 & x < 8]
## name6 name7
## 6 7
x[x %in% c(2:5)]
## name2 name3 name4 name5
## 2 3 4 5
x[match(c(3,1,6,5,11,13),x)]
## name3 name1 name6 name5 <NA> <NA>
## 3 1 6 5 NA NA
x[c('name1', 'name2')]
## name1 name2
## 1 2
which(x > 5)
## name6 name7 name8 name9 name10
## 6 7 8 9 10
which.max(x)
## name10
## 10
which.min(x)
## name1
## 1
2.2 数值型向量的运算
x + y # 相加
x - y # 相减
x / y # 相除
x ^ y # 指数
x %% y # 求余
x %/% y # 整除
abs(x) # 求绝对值
sqrt(x) # 平方根
log2(x) # 2为底的对数
log(x) # e未底的对数
log10(x) # 10为底的对数
log(x,base=n) # 对X取n未底的对数
exp(x) # 指数
sin(x) # 正弦
cox(x) # 余弦
tan(X) # 正切
mean() # 均值
sum() # 求和
max() # 最大值
min() # 最小值
median() # 中位值
ceiling(x) # 取顶
floor(x) # 取底
trunc(x) # 取整
round(x, digits=n) # 将 x 舍入为指定位的小数
round(3.475, digits=2)
## [1] 3.48
signif(x, digits=n) # 将 x 舍入为指定的有效数字位数
signif(3.475, digits=2)
## [1] 3.5
2.3 数值型向量的排序
x = c(3,5,4,1,6,7,8)
# 返回排序后的向量
sort(x)
## [1] 1 3 4 5 6 7 8
# 返回元素对应的排名,升序
rank(x)
## [1] 2 4 3 1 5 6 7
# 返回排序后的向量元素在原向量中的索引,升序
order(x)
## [1] 4 1 3 2 5 6 7
2.4 字符型向量的操作
x = c('aa_11', 'ab_22', 'cc_33')
# 输出字符串的长度
nchar(x)
## [1] 5 5 5
# 输出向量的长度
length(x)
## [1] 3
# 字符串大写
toupper(x)
## [1] "AA_11" "AB_22" "CC_33"
# 字符串小写
tolower(x)
## [1] "aa_11" "bb_22" "cc_33"
# 提取向量中的字符串的子串
substr(x, 1, 3)
## [1] "aa_" "ab_" "cc_"
# 按"_"分割字符串,生成列表
strsplit(x, '_')
## [[1]]
## [1] "aa" "11"
## [[2]]
## [1] "ab" "22"
## [[3]]
## [1] "cc" "33"
# 合并向量
y = c('A','B','C')
paste(x,y,sep = '.')
## [1] "aa_11.A" "ab_22.B" "cc_33.C"
# 反转向量
rev(c('a','b','c'))
## [1] "c" "b" "a"
# 查看字符串是否在向量中,返回位置
grep('a',x)
## [1] 1 2
2.5 向量的去重
unique()
函数去重
# 去重复
a = c(2,3,2,2)
unique(a)
## [1] 2 3
duplicated()
函数去重
vec = c('a','b','a','c')
index = duplicated(vec)
index
## [1] FALSE FALSE TRUE FALSE
vec[!index]
## [1] "a" "b" "c"
2.6 向量的交集、并集、补集
x = 2:5
y = 3:6
z = 4:8
# 取交集
intersect(x, y)
## [1] 3 4 5
# 并集
union(x,y)
## [1] 2 3 4 5 6
# 取补集
setdiff(x,y)
## [1] 2
# 多个向量取交集
Reduce(intersect,list(x,y,z))
## [1] 4 5
# 多个向量取并集
Reduce(union,list(x,y,z))
## [1] 2 3 4 5 6 7 8
# 不同长度向量合并为数据框
mylist = list(a = 1:3,b = 2:6,c = 2:8)
data.frame(lapply(mylist, "length<-", max(lengths(mylist))))
## a b c
## 1 1 2 2
## 2 2 3 3
## 3 3 4 4
## 4 NA 5 5
## 5 NA 6 6
## 6 NA NA 7
## 7 NA NA 8