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

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

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

【问题讨论】:

    标签: list r vector


    【解决方案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.
        

        【讨论】:

          猜你喜欢
          • 2016-03-03
          • 2013-03-31
          • 1970-01-01
          • 2011-07-07
          • 1970-01-01
          • 2011-06-12
          • 1970-01-01
          • 2015-06-07
          相关资源
          最近更新 更多