R编程中的列表

时间:2020-02-23 14:43:51  来源:igfitidea点击:

R中的列表可以将不同种类的变量组合到一个复合结构中。
因此,列表在处理数据方面非常有用。
一个列表可以包含数字,整数字符串,因子甚至其他列表作为其组成部分。

在R中创建列表

可以认为R中的列表类似于R中的向量。
但是,向量或者多或者少是原子的,因为它们的组成无法进一步细分。

列表通常称为递归向量,因为它们由复杂的结构组成,例如向量和可能具有更多成分的其他列表。

让我们首先创建一个列表。

alist <-list(name="Ram",age=25,salary=20000)

列表的每个组成部分都可以通过其名称(以美元符号开头)进行访问。

> alist$name
[1] "Ram"
> alist$age
[1] 25
> alist$salary
[1] 20000

R中的索引列表

但是,不一定总是需要命名列表的组成部分。
我们还可以使用基本索引来引用元素。
让我们创建没有组件名称的相同列表。

> alist <-list("Ram",25,20000)

现在,我们可以访问列表中的每个元素。
请注意,与第一个元素通常为0的其他编程语言相比,索引是如何从1开始的。

> alist[[1]]
[1] "Ram"
> alist[[2]]
[1] 25
> alist[[3]]
[1] 20000

也允许使用方括号内的组件名称进行索引。

> alist <-list(name="Ram",age=25,salary=20000)
> alist[['name']]
[1] "Ram"

让我们看一下更复杂的列表以及如何对其进行索引。
考虑我们正在构建一个游戏,角色在每个位置都有选择权。
有关游戏玩法的所有信息都封装在一个列表中,如下所示。

> mylist <-list(choices=c("Right","Left","Jump","Duck"),pos=matrix(c(22.4,32.5,20,28),ncol=2,nrow=2),charname="Mario")

此处的列表包含可用选项的向量,字符在屏幕上的位置的矩阵以及字符名称(字符串)。
让我们看看如何索引这些。

#Access the elements of the vector within the list
> mylist$choices[2]
[1] "Left"

#Get the matrix from the list
> mylist$pos
   [,1] [,2]
[1,] 22.4   20
[2,] 32.5   28

#Access elements of matrix using the indexes
> mylist$pos[1,2]
[1] 20

分配名称

创建列表后,还可以按以下方式重新分配列表组件的名称。
无论您是否已分配名称,此方法都有效。

> names(mylist)=c("Actions","Positions","Name")
> mylist
$Actions
[1] "Right" "Left"  "Jump"  "Duck" 

$Positions
   [,1] [,2]
[1,] 22.4   20
[2,] 32.5   28

$Name
[1] "Mario"

修改列表

您始终可以使用美元符号将新组件添加到列表中,如下所示。
我们将演示添加一个名为" lives"的新组件,该组件的整数值为3。

> mylist$lives <-3
> mylist
$Actions
[1] "Right" "Left"  "Jump"  "Duck" 

$Positions
   [,1] [,2]
[1,] 22.4   20
[2,] 32.5   28

$Name
[1] "Mario"

$lives
[1] 3

嵌套列表

可以将一个列表作为组件添加到另一个列表中。
可以在任何深度级别上完成。
在这种情况下,索引遵循嵌套模式。
让我们来看一个例子。

#Create a list to represent the player 
> player <- list(name="Adam",age=16,location= "USA")

#Add this as a component to the list we created earlier.
> mylist$player <- player

#Display the list.
> mylist
$Actions
[1] "Right" "Left"  "Jump"  "Duck" 

$Positions
   [,1] [,2]
[1,] 22.4   20
[2,] 32.5   28

$Name
[1] "Mario"

$lives
[1] 3

$player
$player$name
[1] "Adam"

$player$age
[1] 16

$player$location
[1] "USA"

当我们需要在" mylist"中引用播放器的位置时,可以使用" mylist $player $location"来实现。

> mylist$player$location
[1] "USA"

当尝试以上述方式访问列表元素时,请记住嵌套顺序,这一点很重要。
通常使用列表来返回函数输出。
但是,由于它们的可变性,与向量和矩阵相比,它们会消耗大量内存。
因此,在编程时必须小心处理列表。