R中向量和列表数据类型之间的主要区别是什么?使用(或不使用)这两种数据类型有哪些优点或缺点?
我希望看到演示数据类型用例的示例。
答案 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.