R中的向量和列表数据类型之间有什么区别?


127

R中的向量和列表数据类型之间的主要区别是什么?使用(或不使用)这两种数据类型的优点或缺点是什么?

我希望看到示例演示数据类型的用例。

Answers:


77

从技术上讲,列表向量,尽管很少使用该术语。“列表”是几种模式之一,其他是“逻辑”,“字符”,“数字”,“整数”。用严格的R术语来说,您所说的向量是“原子向量”:

 aaa <- vector("list", 3)
 is.list(aaa)   #TRUE
 is.vector(aaa)  #TRUE

列表是(向量的)“递归”类型,而原子向量不是:

is.recursive(aaa)  # TRUE
is.atomic(aaa)  # FALSE

您可以根据数据对象是递归的,原子的还是具有维属性(矩阵和数组)来处理具有不同功能的数据对象。但是,我不确定对不同数据结构的“优缺点”的讨论是否足以解决SO问题。补充汤米说的话,除了列表可以容纳任意数量的其他向量外,还有数据帧的可用性,数据帧是具有定义其结构的维属性的列表的一种特殊类型。与真正折叠的原子对象的矩阵和数组不同,数据框可以包含各种类型,包括因子类型。

还有一个警告,当名称以外的属性存在时,is.vector函数将返回FALSE。请参阅:什么是向量?


54

列表是“递归的”。这意味着它们可以包含不同类型的值,甚至可以包含其他列表:

x <- list(values=sin(1:3), ids=letters[1:3], sub=list(foo=42,bar=13))
x # print the list
x$values   # Get one element
x[["ids"]] # Another way to get an element
x$sub$foo  # Get sub elements
x[[c(3,2)]]  # Another way (gets 13)
str(x)     # A "summary" of the list's content

R中使用列表表示数据集:data.frame该类实质上是一个列表,其中每个元素都是特定类型的列。

表示模型时的另一用途是:的结果lm返回一个包含一堆有用对象的列表。

d <- data.frame(a=11:13, b=21:23)
is.list(d) # TRUE
str(d)

m <- lm(a ~ b, data=d)
is.list(m) # TRUE
str(m)

原子向量(非列表式,但数字,逻辑和字符)很有用,因为已知所有元素都具有相同的类型。这使得操作它们非常快。


20

作为刚接触R但来自C / Java / Ruby / PHP / Python背景的人,这就是我的看法。

A list实际上是一个数组+一个哈希表。这是一个PHP关联数组。

> foo = list(bar='baz')
> foo[1]
'baz'
> foo$bar
'baz'
> foo[['bar']]
'baz'

A vector是固定类型的数组/列表。可以将其视为一个链表-因为将不同的项目放入链表始终是一种反模式。与SIMD / MMX / vector单位使用单词的含义相同,它是一个向量。


3
key使用names方法可以在向量中包含。
gokul_uf

9

http://www.burns-stat.com/pages/Tutor/hints_R_begin.html中可以回答此问题和类似的入门问题

它旨在作为一个简短的介绍,使您尽快开始使用R。在某种程度上,它成功了。

-编辑:-

试图进一步解释;从以上引用中引用。

原子向量

您可能会遇到三种类型的原子向量:

  • “数字”
  • “逻辑的”
  • “字符”

关于原子向量,要记住的是它们中的所有元素都是一种类型。

清单

列表在不同的组件中可以具有不同类型的项目。列表的组成部分可以是另一个列表,原子向量(和其他东西)。

另请参阅链接。


2
不推荐使用:您至少应指出我们该网站的特定部分,该部分可以回答原始问题。
nbro

2

列表包括多种数据类型,例如字符,数字,逻辑等。但是向量仅包含相似类型的数据。例如:

scores <- c(20,30,40,50)
student <- c("A","B","C","D")
sc_log <- c(TRUE,FALSE,FALSE,TRUE)

对于列表:

mylist <- list(scores,student,sc_log)
# search for class of mylist vector 
#check structure of mylist using str() function.
str(mylist)
[1] list of 3
[1] $:num [1:4] 20 30 40 50
[2] $:chr [1:4] "A""B""C""D"
[3] $:log [1:4] TRUE FALSE FALSE TRUE

这意味着列表包含mylist中的多种数据类型,例如数字,字符和逻辑。但是在vector中,该vector中所有元素的数据类型都是单一的

例如:

对于矢量:

vector1 <- c(1,2,3,4)
Class(vector1)
[1] "Numeric"

#which means all elements of vector containing single data type that is numeric only.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.