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
两种方式:
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 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
两种方式:
选择第n位元素,并返回一个元素。
选择规定下标的元素,返回一个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]] [1] 2
> l[c(1,2,3)] [[1]] [1] 1
[[2]] [1] 2
[[3]] [1] 3
> l[2] [[1]] [1] 2
|
2.3 List Name Indexing
三种方法:
返回名为itemName
的元素,若不存在则返回NULL
.
(此方法有别于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,如下:
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 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 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
两种方法:
基于向量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,] > v <- m[,b]
|
以上两个方法返回的是向量,若要返回单行矩阵或者单列矩阵,则需设置drop
参数为FALSE
,如下:
1 2
| > vm <- m[a,,drop=FALSE] > vm <- m[,b,drop=FALSE]
|
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
感谢你的支持