一:从向量提取/对向量插入元素
1:提取
使用函数“【”来从一个向量中提取元素,他可以取以下的参变量:
- 要提取的元素的索引所构成的向量
- 不提取的元素的索引所构成的向量
- 逻辑值TRUE/FALSE构成的向量(指示哪些元素被提取)。
> vec<-c(2,4,6,8,3)
> vec[2]
[1] 4
> vec[-2]
[1] 2 6 8 3
> vec[2:5]
[1] 4 6 8 3
> vec[-c(1,5)]
[1] 4 6 8
> vec[c(T,F,F,T,F)]
[1] 2 8
> vec[vec>4]
[1] 6 8
在这里需要注意的是,诸如X[Y>0]的简单语法就可以将向量x中满足条件yi>0的位置索引i所对应得元素全部提取出来。
> x<-1:5
> y<-c(-1,2,-3,4,-2)
> x[y>0]
[1] 2 4
另外,需要注意其他几个非常有用的函数:which(),which.min(),which.max()
> x<-c(TRUE,FALSE,TRUE,FALSE,FALSE,TRUE)
> which(x) #输出对应于值TRUE的位置索引
[1] 1 3 6
> which.max(x) #输出最大值的位置索引
[1] 1
> which.min(x) #输出最小值的位置索引
[1] 2
注意:R不处理位置索引0.
2:替换
选择想要替换的元素,然后用赋值符号<-后面紧跟替代目标元素。当然,需要指定与挑选号的元素同样数目的替代目标元素。
> z<-c(0,0,0,2,0)
> z
[1] 0 0 0 2 0
> z[c(1,5)]<-1
> z
[1] 1 0 0 2 1
> z[which.max(z)]<-1
> z
[1] 1 0 0 1 1
> z[z==0]<-8
> z
[1] 1 8 8 1 1
3:插入
使用函数c()来给一个现有的向量插入或添加元素
> x<-c(1,3,6,2,7,8,1,0)
> x
[1] 1 3 6 2 7 8 1 0
> (b<-c(a,4,1))
[1] 4 6 2 7 4 1
> b<-c(x,4,1)
> b
[1] 1 3 6 2 7 8 1 0 4 1
> c<-c(a[1:4],8,5,a[5:8])
> c
[1] 4 6 2 7 8 5 NA NA NA NA
> c<-c(x[1:4],8,5,x[5:8])
> c
[1] 1 3 6 2 8 5 7 8 1 0
二:从矩阵中提取/对矩阵插入元素
1:提取
有两种方法可以用来从矩阵中提取元素
(a)通过索引来提取:X[indr,indc],其中indr是要提取的各行索引的向量而indc是各列索引的向量。若省略indr(或indc)则意味着所有的行都被选择。注意indr或indc都可在前面加负号表明不提取某行或某列的元素。
> x
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
> x[2,3]
[1] 6
> x[,1]
[1] 1 4 7 10
> x[c(1,4),]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 10 11 12
> x[3,-c(1,3)]
[1] 8
(b)通过逻辑掩蔽来提取:X[mask],其中mask是由逻辑值TRUE/FALSE构成的且与X大小相同的矩阵,指示矩阵中哪些元素将被提取。
> y<-matrix(c(TRUE,FALSE),nrow=4,ncol=3)
> y
[,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] FALSE FALSE FALSE
[3,] TRUE TRUE TRUE
[4,] FALSE FALSE FALSE
> x[y]
[1] 1 7 2 8 3 9
有时也可以使用as.vector()函数将矩阵转换为向量进行提取。
注意:使用函数“["有时会导致被操作对象的结构发生改变。来看下面的这个例子;
> x<-matrix(1:6,nrow=2)
> x
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> x[,1]
[1] 1 2
> class(x[,1])
[1] "integer"
在以上情况中,我们原本可能想获得一个简单的只有一列的矩阵,但是结果却转化为了一个向量。对这个问题我们
可以采用如下代码来解决
> x[,1,drop=FALSE]
[,1]
[1,] 1
[2,] 2
与向量运算情形一样,函数which()也可以用来返回一个矩阵中满足某个条件的那些元素的位置索引,
> x<-matrix(c(1,2,3,1,2,3,2,1,3),3,3)
> x
[,1] [,2] [,3]
[1,] 1 1 2
[2,] 2 2 1
[3,] 3 3 3
> which(x==1) #m视为矩阵各列串联后形成的长向量
[1] 1 4 8
> which(x==1,arr.ind=TRUE) #输出成对形式的行列位置索引
row col
[1,] 1 1
[2,] 1 2
[3,] 2 3
2:插入
与向量的做法一样,先通过索引或逻辑掩蔽来选择元素,然后用其他的元素通过赋值符号<-来实现替换
> x[x!=2]<-0
> x
[,1] [,2] [,3]
[1,] 0 0 2
[2,] 2 2 0
[3,] 0 0 0
另外一个函数也可用来提取元素:subset()。具体内容见提取子集文章
三:从数组提取/对数组插入元素
从数组提取或对数组插入元素的操作与矩阵的情形类似,唯一的差别是数组可能会超过两维。
> a<-array(1:12,dim=c(2,2,3))
> a
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3
[,1] [,2]
[1,] 9 11
[2,] 10 12
> a[2,1,1]
[1] 2
> a[1,2,3]
[1] 11
> a[2,2,1]
[1] 4
> a[1,2,3]<-4
> a
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3
[,1] [,2]
[1,] 9 4
[2,] 10 12
> which(a==4,arr.ind=TRUE)
dim1 dim2 dim3
[1,] 2 2 1
[2,] 1 2 3
> a[which(a==4,arr.ind=TRUE)]
[1] 4 4
> length(a[a>4])
[1] 7
四:从列表中提取/对列表插入元素
1;提取
从列表中提取元素比矩阵的情形要稍稍复杂一些,这是因为一个列表的每个元素(一级分量)本身也是一个列表。因此,对一个列表使用函数“【”会输出另一个列表。
> L<-list(12,c(34,67,8),matrix((1:12),3,4),1:15,list(10,11))
> L
[[1]]
[1] 12
[[2]]
[1] 34 67 8
[[3]]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
[[4]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[[5]]
[[5]][[1]]
[1] 10
[[5]][[2]]
[1] 11
> class(L[2])
[1] "list"
> L[c(3,4)]
[[1]]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
[[2]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
因为列表常用于存储具有不同性质的元素(基本单元),必须使用函数"[["来访问一个列表的基本单元。
> L[[2]]
[1] 34 67 8
> class(L[[2]])
[1] "numeric"
> L[[5]][[2]]
[1] 11
R定义了所谓的递归索引,例如,下面的例子会先检索列表L的第二个分量的内容,然后提取该向量的第三个元素:
> L[[c(2,3)]]
[1] 8
此外,R中存在一个机制来对列表的各个分量进行明确地命名,随后就可使用符号$通过分量的名字来提取元素
> L<-list(cars=c("ford","peugeot"),climate=c("tropical","temperate"))
> L[["cars"]]
[1] "ford" "peugeot"
> L$cars
[1] "ford" "peugeot"
2.插入
插入分量或元素时可按照前述的方法,即可使用赋值符号<-
> L$climate[2]<-"Continental"
> L
$cars
[1] "ford" "peugeot"
$climate
[1] "tropical" "Continental"
注意:一个列的名称中可以包含空格,为了访问他,需要用到双引号
> L<-list("pretty cars"=c("ford","peugeot"))
> L
$`pretty cars`
[1] "ford" "peugeot"
> L$"pretty cars"
[1] "ford" "peugeot"
五.在数据框中添加或删除列
使用transform()函数。
> x<-data.frame(date=c("03 JANUA","02 SEPTE","15 NOCEM"),sun=c(10,15,12))
> x
date sun
1 03 JANUA 10
2 02 SEPTE 15
3 15 NOCEM 12
> transform(x,day=c(1,2,3),month=c(4,8,9),date=NULL)
sun day month
1 10 1 4
2 15 2 8
3 12 3 9