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

150

在R语言中,向量(vector)和列表(list)数据类型有哪些主要区别?使用这两种数据类型的优缺点是什么?

如果能提供演示这两种数据类型使用情况的示例,将不胜感激。

5个回答

86
列表允许数据对象具有任意结构和多种数据类型。原子向量可以通过一维索引(这样可以更快地访问值)并且只能容纳一类项目。将具有不同类型的项目分配给一个原子向量可能导致整个原子向量强制转换为新的数据类型。矩阵或数组类对象是具有附加维度属性的原子对象。从技术上讲,列表是向量,尽管很少有人使用这个术语。"list"是几种模式之一,其他模式包括"logical"、"character"、"numeric"和"integer"。在严格的R术语中,你所称呼的向量是"atomic vectors"。
 aaa <- vector("list", 3)
 is.list(aaa)   #TRUE
 is.vector(aaa)  #TRUE

列表是一种“递归”类型(的向量),而原子向量则不是。
is.recursive(aaa)  # TRUE
is.atomic(aaa)  # FALSE

你根据数据对象的递归性、原子性或维度属性(矩阵和数组)使用不同的函数进行处理。然而,我不确定对于不同数据结构的“优缺点”讨论是否足够专注于SO。除了Tommy所说的,列表能够容纳任意数量的其他向量,还有数据框(dataframes)的可用性,它是一种特殊类型的列表,具有定义其结构的维度属性。与矩阵和数组不同,它们是真正折叠的原子对象,数据框可以容纳包括因子类型在内的不同类型。
S4对象是具有相关功能要求的特殊列表类型。
在整洁宇宙(tidyverse)中引入的“tibble”数据类型增加了对基本R中数据框类型中包含列表的列的灵活性。
还有一个需要注意的是,当存在除名称之外的属性时,is.vector函数将返回FALSE。参见:什么是向量?

61

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

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)

原子向量(非列表形式,但是数值、逻辑和字符类型)非常有用,因为所有元素都被知道具有相同的类型。这使得对它们进行操作非常快速。


24
作为一个刚接触R语言的人,但是有C / Java / Ruby / PHP / Python背景的人,这是我对它的看法。
一个“列表”实际上是一个数组+哈希表。它就像PHP中的关联数组。
> foo = list(bar='baz')
> foo[1]
'baz'
> foo$bar
'baz'
> foo[['bar']]
'baz'

向量是一种固定类型的数组/列表。可以将其视为链表 - 因为将不同类型的项放入链表中本身就是一种反模式。它与SIMD/MMX/向量单元使用该术语的含义相同。


6
使用names方法可以在向量中设置键名key - gokul_uf

10

此类问题及其简介可在http://www.burns-stat.com/pages/Tutor/hints_R_begin.html中得到解答。

该网站旨在为您提供尽可能快速的R入门介绍。 在某种程度上,它成功了。

--- 编辑:--

以下是对上述参考文献的进一步解释:

原子向量

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

  • "numeric"(数值型)
  • "logical"(逻辑型)
  • "character"(字符型)

关于原子向量的重要一点是,其中的所有元素都只属于一种类型。

列表

列表可以具有不同类型的不同组件。列表的一个组件可以是另一个列表、原子向量(和其他东西)。

请参考此链接


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包含多种数据类型,如数字、字符和逻辑;而在向量中,则所有元素的数据类型都相同。
例如:
对于向量:
vector1 <- c(1,2,3,4)
Class(vector1)
[1] "Numeric"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接