提取和插入元素

这篇博客详细介绍了如何在R语言中对向量、矩阵、数组、列表和数据框进行元素的提取和插入操作。提取方法包括使用索引、逻辑值以及函数如which()。插入元素通常涉及使用c()函数或赋值符号"<-"。对于数据框,可以用transform()函数添加或删除列。注意,R语言中不处理位置索引0,并且使用"["操作可能改变数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:从向量提取/对向量插入元素

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值