R中的向量和列表数据类型有啥区别?

Posted

技术标签:

【中文标题】R中的向量和列表数据类型有啥区别?【英文标题】:What are the differences between vector and list data types in R?R中的向量和列表数据类型有什么区别? 【发布时间】:2012-01-25 13:25:59 【问题描述】:

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

如果能看到展示数据类型用例的示例,我将不胜感激。

【问题讨论】:

【参考方案1】:

技术上列出了向量,尽管很少有人会使用这个术语。 “列表”是几种模式之一,其他模式是“逻辑”、“字符”、“数字”、“整数”。您所说的向量是严格的 R 用语中的“原子向量”:

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

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

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

您使用不同的函数处理数据对象,具体取决于它们是递归的、原子的还是具有维度属性(矩阵和数组)。但是,我不确定讨论不同数据结构的“优缺点”对于 SO 来说是一个足够集中的问题。补充一下 Tommy 所说的,除了列表能够保存任意数量的其他向量之外,还有数据框的可用性,这是一种特定类型的列表,具有定义其结构的维度属性。与真正折叠的原子对象的矩阵和数组不同,数据帧可以包含不同的类型,包括因子类型。

还有一点需要注意的是,当存在名称以外的属性时,is.vector 函数将返回 FALSE。见:what is vector?

【讨论】:

【参考方案2】:

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

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)

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

【讨论】:

【参考方案3】:

http://www.burns-stat.com/pages/Tutor/hints_R_begin.html 回答了这个和类似的介绍性问题

这是一个温和的介绍,让您尽快开始使用 R。在某种程度上它成功了。

--- 编辑:--

试图进一步解释;引用自上述参考资料。

原子向量

您可能会使用三种原子向量 遇到:

“数字” “逻辑” “字符”

关于原子向量要记住的是所有元素 其中只有一种类型。

列表

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

也请参考this链接。

【讨论】:

投反对票:您至少应该将我们指向该网站的回答原始问题的特定部分。【参考方案4】:

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

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

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

vector 是一个固定类型的数组/列表。把它想象成一个链表——因为将不同的项目放入一个链表是一种反模式。它是一个向量,与 SIMD/MMX/向量单元使用这个词的意义相同。

【讨论】:

您可以使用names 方法在向量中包含keys。【参考方案5】:

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

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 中的数字、字符和逻辑。但在向量中,该向量中的所有元素将有单一数据类型

例如:

对于矢量:

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

#which means all elements of vector containing single data type that is numeric only.

【讨论】:

以上是关于R中的向量和列表数据类型有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

R语言基础知识学习:R中的数据类型和数据结构

将 R 中的数据帧连接/合并为向量类型单元格

integer和int有啥区别

R语言数据类型numeric

MySQL 中的 BLOB 和 TEXT 数据类型有啥区别?

R语言里面的向量指的是啥,和数组有啥分别?应用于啥上面?