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
方法在向量中包含key
s。【参考方案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中的向量和列表数据类型有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章