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

时间:2011-12-21 18:49:49

标签: list r vector

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

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

6 个答案:

答案 0 :(得分:65)

技术上列出向量,尽管很少会使用该术语。 “list”是几种模式中的一种,其他模式是“逻辑”,“字符”,“数字”,“整数”。你所谓的向量是严格的R术语中的“原子”:

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

列表是“递归”类型,而原子矢量不是:

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

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

答案 1 :(得分:44)

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

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)

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

答案 2 :(得分:16)

作为刚刚进入R的人,但来自C / Java / Ruby / PHP / Python背景,我就是这么想的。

list实际上是一个数组+一个hashmap。它是一个PHP关联数组。

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

vector是固定类型的数组/列表。可以把它想象成一个链表 - 因为将不相似的项目放入链表中反正是一种反模式。它是一个与SIMD / MMX /向量单位使用单词相同意义上的向量。

答案 3 :(得分:8)

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

中得到了解答

这是一个温和的介绍,可以让您尽快启动和运行R.在某种程度上它成功了。

---编辑: -

试图进一步解释;引自上述参考文献。

  

原子载体

     

您可能会有三种原子矢量   遭遇:

     
      
  • “数字”
  •   
  • “logical”
  •   
  • “字符”
  •   
     

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

     

列表

     

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

另请参阅this链接。

答案 4 :(得分:3)

向量(一维数组):可以包含数值,字符或逻辑值。向量中的元素都具有相同的数据类型。

R中的列表类似于工作或学校的待办事项列表:该列表中的不同项目在长度,特征,必须完成的活动类型方面可能不同,...

R中的列表允许您以有序的方式收集一个名称下的各种对象(即列表的名称)。这些对象可以是矩阵,向量,数据帧,甚至是其他列表等。甚至不要求这些对象以任何方式相互关联。

你可以说列表是某种超级数据类型:你几乎可以在其中存储任何信息!

要构建列表,请使用函数列表(): my_list&lt; - list(comp1,comp2 ...)

list函数的参数是列表组件。请记住,这些组件可以是矩阵,向量,其他列表......

总而言之,列表和向量之间的主要区别是R中的 list 允许您以一个名称(即名称)收集各种对象列表)有序的方式。这些对象可以是矩阵,向量,数据框,甚至是其他列表等。甚至不要求这些对象以任何方式相互关联......而向量中的元素全部具有相同的数据类型。

答案 5 :(得分: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中的逻辑。但是在向量中,该向量中将包含所有元素的单一数据类型

代表:

for 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.