R学习3-Vector List Matrix

Made by Mike_Zhang


所有文章:
R学习1-基础
R学习2-I/O
R学习3-Vector List Matrix
R学习4-Data Frame
R学习5-Graphics


1 Vector

之前的文章中提过,向量(Vector)是R的核心组成部分。

1.1 Vector Appending

两种方式:

1
> v <- c(v,addItem)

addItem 可以为单个元素,也可以一个Vector。

1
> v[length(v)+1] <- addItem

此方法适用于加上一个单独的元素。

例如:

1
2
3
4
5
6
7
8
> v <- c(1,2,3,4,5)
> v <- c(v,6)
> v
[1] 1 2 3 4 5 6

> v[length(v)+1] <- 7
> v
[1] 1 2 3 4 5 6 7

第二种方法中,如下标超出向量范围也不会报错,R会自动用NA填充中间的缺失元素,如下:

1
2
3
> v[15] <- 15
> v
[1] 1 2 3 4 5 6 7 NA NA NA NA NA NA NA 15

1.2 Vector Inserting

1
> append(v,insertItem,after)

此方法在v向量第after位后插入insertItem元素,并返回一个新的向量
after为0,则插到向量开头。如下:

1
2
3
4
5
> v <- c(1,2,3,4,5)
> append(v,10,2)
[1] 1 2 10 3 4 5
> append(v,0,0)
[1] 0 1 2 3 4 5

2 List

List不同于Vector,List可以包含多种类型的元素,与大多数编程语言类似。

2.1 List Creation

1
> l <- list(a,b,c)
1
2
3
4
5
6
7
8
9
10
> l <- list(1,2,3)
> l
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

也可以创建空的List,后续添加元素,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> l <- list()
> l
list()
> l[[1]] <- 1
> l[[2]] <- 2
> l[[3]] <- 3
> l
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]

也可以在创建List的时候为其元素命名,如下:

1
2
3
4
5
6
7
8
9
10
> l <- list(one=1,two=2,three=3)
> l
$one
[1] 1

$two
[1] 2

$three
[1] 3

2.2 List Position Indexing

两种方式:

1
l[[n]]

选择第n位元素,并返回一个元素

1
l[c(1,2,3,...)]

选择规定下标的元素,返回一个List

l[n]
为第二种方法的特殊情况,也返回一个List,只包含第n位元素。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> l <- list(1,2,3,4,5)
> l[[2]] # return an element
[1] 2

> l[c(1,2,3)] # return a List
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

> l[2] # return a List
[[1]]
[1] 2

2.3 List Name Indexing

三种方法:

1
l[["itemName"]]

返回名为itemName的元素,若不存在则返回NULL.
(此方法有别于l["itemName"],类似于上节。)

1
l$itemName

返回名为itemName的元素,若不存在则返回NULL.

1
l[c(itemName1,itemName2,itemName3,...)]

根据规定的名字返回一个List。

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> l <- list(one=1,two=2,three=3)

> l[['two']]
[1] 2

> l$"two"
[1] 2

> l[c('one','three')]
$one
[1] 1

$three
[1] 3

2.4 Key-Value List

类似于Dictionary, HashTable等。

如下:

1
2
3
4
5
6
7
8
9
10
> l <- list(one=1,two=2,three=3)
> l
$one
[1] 1

$two
[1] 2

$three
[1] 3

或者:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> l <- list()

> l['one'] <- 1
> l['two'] <- 2
> l['three'] <- 3
> l
$one
[1] 1

$two
[1] 2

$three
[1] 3

可以通过key访问其对应的value,如下:

1
2
> l[['one']]
[1] 1

2.5 List Element Removing

通过给元素赋值为NULL,即可移除此元素,如下:

1
2
3
4
5
6
7
8
> l[['one']] <- NULL
>
> l
$two
[1] 2

$three
[1] 3

或者一次移除多个元素,如下:

1
2
3
4
5
> l[c('two','three')] <- NULL
>
> l
$one
[1] 1

2.6 Convert List to Vector

由于一些方法只接受向量类型的参数,因此需要把List转换成Vector,如下:

1
> ul <- unlist(l)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> l <- list(1,2,3,4,5)
> l
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

[[5]]
[1] 5

> ul <- unlist(l)
> ul
[1] 1 2 3 4 5

2.7 List NULL Element Removing

移除List中的NULL元素,如下:

1
> l[sapply(l, is.null)] <- NULL

如下:

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
> nl <- list(1,2,NULL,4,5)
> nl
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
NULL

[[4]]
[1] 4

[[5]]
[1] 5

> nl[sapply(nl,is.null)] <- NULL
> nl
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 4

[[4]]
[1] 5

2.8 List Element Conditionally Removing

可以通过条件语句来移除某一或某些元素,如下:

1
l[CON] <- NULL

如下:

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
> l
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

[[5]]
[1] 5

> l[l<3] <- NULL
> l
[[1]]
[1] 3

[[2]]
[1] 4

[[3]]
[1] 5

3 Matrix

3.1 Matrix Creation

两种方法:

1
> matrix(v,m,n)
1
> dim(v) <-  c(2,3)

基于向量v,创建一个m*n的矩阵。

注意:
此矩阵是默认逐列构造的

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> v <- c(1,2,3,4,5,6)
> m <- matrix(v,2,3)

> m
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

> zerom <- matrix(0,2,3)
> zerom
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0

> nam <- matrix(NA,2,3)
> nam
[,1] [,2] [,3]
[1,] NA NA NA
[2,] NA NA NA

如要逐行构造,需设置byrow参数为TRUE,如下:

1
2
3
4
5
> rowm <- matrix(v,2,3,byrow=TRUE)
> rowm
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6

第二种方法是直接把向量转化为矩阵,更加快捷,如下:

1
2
3
4
5
6
> v <- c(1,2,3,4,5,6)
> dim(v) <- c(2,3)
> v
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6

3.2 Matrix Operation

t(A): Matrix transposition of A

solve(A): Matrix inverse of A

A %*% B: Matrix multiplication of A and B

A * B: Element-wise multiplication of A and B

diag(A): An n-by-n diagonal identity matrix

3.3 Matrix Row Column Naming

1
2
rownames(m) <- c('name1','name2','name3',...)
colnames(m) <- c('name1','name2','name3',...)

如下:

1
2
3
4
5
6
7
8
9
10
> m
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> rownames(m) <- c('one','two')
> colnames(m) <- c('one','two','three')
> m
one two three
one 1 3 5
two 2 4 6

可以通过行名和列名访问对应的元素,如下:

1
2
> m['two','three']
[1] 6

3.4 Matrix Row Column Selecting

1
2
> v <- m[a,] # ath row
> v <- m[,b] # bth column

以上两个方法返回的是向量,若要返回单行矩阵或者单列矩阵,则需设置drop参数为FALSE,如下:

1
2
> vm <- m[a,,drop=FALSE] # ath row
> vm <- m[,b,drop=FALSE] # bth column
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> m
one two three
one 1 3 5
two 2 4 6

> m[1,]
one two three
1 3 5
> m[,2]
one two
3 4

> m[1,,drop=FALSE]
one two three
one 1 3 5
> m[,2,drop=FALSE]
two
one 3
two 4

参考

P. Teetor, R Cookbook. Sebastopol: O’Reilly Media, Incorporated, 2011.


写在最后

R语言相关的知识会继续学习,继续更新.
最后,希望大家一起交流,分享,指出问题,谢谢!


原创文章,转载请标明出处
Made by Mike_Zhang




感谢你的支持

R学习3-Vector List Matrix
https://ultrafish.io/post/R-learning-3/
Author
Mike_Zhang
Posted on
December 21, 2021
Licensed under