R-數據科學(三):向量

之前我在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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章