当从列表中强制时,矩阵如何能够保存不同的数据类型?

时间:2016-11-28 19:51:00

标签: r matrix

As commonly known,矩阵只能容纳一种数据类型。

但似乎我可以将列表强制转换为矩阵。

tmp <- matrix(list(1, "a"))
class(tmp)
  

[1]&#34;矩阵&#34;

str(tmp)
  

2的列表

     

$:num 1

     

$:chr&#34; a&#34;

     
      
  • attr(*,&#34; dim&#34;)= int [1:2] 2 1
  •   

是否记录了这种行为?

1 个答案:

答案 0 :(得分:2)

(这是我第一次回答,欢迎提供格式提示和建议) 这是因为它不是矢量矩阵,它是一个列表矩阵!更清楚的是,这种类型的&#39; matrix is holding是名为lists的数据结构类型。并且List 不是R中的一维而是n维!在R中,这意味着列出能够轻松处理不同数据类型的能力允许其他函数(如矩阵)打破自己的限制并处理多个数据类型。事实上,用我的教授的话来说,正是这种R列表版本的n维力量是R处理大数据比java或python语言更好的十大理由之一

正如@nrussel所指出的那样,matrix()文档仅暗示了这种行为,并且没有关于矩阵列表组合的确切文档;但是,我将展示一个简单的代码将有助于澄清这种行为,然后显示各种网站如何支持。我的示例代码的灵感来自于42-[1]在堆栈溢出中回答的另一个问题:

    tmp <- matrix(list(1, "a"))
    str(tmp)
> List of 2
>
> $ : num 1
> 
> $ : chr "a"
>
> attr(*, "dim")= int [1:2] 2 1
    class(tmp)
  

&#34;基质&#34;

    is.matrix(tmp)
    is.list(tmp)
    is.array(tmp)
  

TRUE TRUE TRUE

    tmp <- matrix(list(c(1,2), c("a","b"))
    str(tmp)
  

2的列表

     

$:num [1:2] 1 2

     

$:chr [1:2]&#34; a&#34; &#34; B&#34;

     

attr(*,&#34; dim&#34;)= int [1:2] 2 1

那么这里发生了什么?虽然初学者R教程[2]有时过度简化列表[3],但R中的列表像向量一样,并且不完全是1维(1D)。与其他语言不同,列表实际上是1 x (n x m)维(1nD)。 (旁白:列表有时甚至是1 x (n x m ... n+1),但我稍后会解释)。与大多数语言一样,列表是数据结构的集合。

上面的例子中又发生了什么?查看上面的输出,首先是str(tmp)is.matrixis.listclass()is.matrix,告诉我们整体功能是一个矩阵。然而,str()告诉我们,maxtrix内部是一个列表。 Str()告诉使用每个列表只列出1个值,这意味着它只有1 x 1列表。所以它的1 x 2矩阵是1 x 1列表。这就是为什么is.list()给出值为TRUE的原因,因为从技术上讲,矩阵中只有列表。

现在让我们在代码中查看第二个示例或第二个str(tmp)时更多地讨论列表。与大多数语言一样,列表是数据结构的集合。列表的各个部分可以是简单的向量,如data.frame,但允许列具有不同的长度和数据类型。然而,与其他语言不同,R中的列表也可以是更复杂的结构(从ramnathv [3]转述)。如上所示,请看[1:2][number:number]行告诉我们第二个例子中的每个内部列表都是1 x 2.然而,str(tmp)仍然告诉我们我们的矩阵仍然只有1 x 2.这是因为矩阵只列出作为个体,矩阵表现得像1 x 2向量。结合列表和矩阵观察,整体矩阵列表的维度为1 x (2 x (1 x 2))。它的两个1 x 2's。这种1 x (2 x (1 x 2)格式显示了我所说的1 x (n x m)维度列表以及ramnathv列表中的复杂结构&#39;。由于将列表与数组组合在一起的行为可能仍然不清楚,因此我们可以深入研究这个复杂的结构。#34;复杂的结构&#34;列表。

====列表的更深层含义是nD允许列表矩阵具有====

Paul Murrell [6]在谈到列表复杂的结构时指出了如何:

  

在R列表中充当容器。与(常规)原子向量不同,列表的内容不限于单一模式,并且可以包含任何数据类型的混合。列表有时称为递归向量,因为列表可以包含其他列表。这使它们与(常规)原子矢量根本不同。

通过原子向量,保罗正在谈论大多数其他人所谓的向量。 (在R中,常规数字或字符向量不是称为向量而是原子向量,以便将它们与列表等广义向量区分开。)为了说明Paul Murrell在上面引用中的含义,让我们看一下另一个更复杂的列表。然后在与矩阵结合时查看递归向量列表。

    tmp1 <- matrix(list(c(1,2,3),c("a","b","c","d"),as.factor("soup")))
    str(tmp1)
  

2的列表

     

$:num [1:3] 1 2 3

     

$:chr [1:4]&#34; a&#34; &#34; B&#34; &#34; C&#34; &#34; d&#34;

     

$:因子w / 1级&#34;汤&#34;:1

     

attr(*,&#34; dim&#34;)= int [1:2] 2 1

递归矩阵列表

    tmp2 <- matrix(list(c(1,2,3),c("a","b","c"),list(c(1,2,3),c("a","b","c"))))
    str(tmp2)
    tmp3 <- matrix(list(c(1,2,3),c("a","b","c"),matrix(list(c(1,2,3),c("a","b","c")))))
    str(tmp3)
  

我会留下输出给你发现。

在第一个例子中,我们看到我希望R中的不同列表可以来自原子向量。在此列表中,我们不仅看到列表可以具有不同的1 x n大小,而且不仅是完全不同的类型,而且列表可以包含数据结构(例如,因子)。因素相信或不是数据类型,而是R具有[4]的最广义的向量形式;一个不关心其数据的向量在类型[5]中是同质的。我将不得不用str(tmp1)告诉我们的数学来挥挥手,但整体矩阵列表现在是(1 x 3*) or 1 x ((1 x 3) + (1 x 4) + (1 x 1))。然而,矩阵本身认为它只是一个在列表示例列表中,列表允许矩阵像一个结构化数据的真正通用表,它由变量类型,行数或变量类不同。比java或python中创建相同的通用结构要简单得多。我希望你能在开始时看到它如何将对话完整地转到我的观点......

  

TLDR答案: R中的列表是n维而不是1维!在R中,列出了轻松处理不同数据类型的能力,允许其他函数(如 matrix )打破自身的局限并处理多种数据类型。

但是,list也可以包含自己的列表,如最后两段代码所示。从字面上看,我已经发布了两种不同的方式,可以使用列表将相同的变量作为列表的新部分传递给自身。如果我要绘制数据表的样子,这个列表的重复就像Infinity Mirror一样,因为它具有不断折叠的维(n + 1)1 x (n x m ... n+1)。我只是提出这个来扩展我的答案,以显示如何在R中使用列表矩阵,以允许常规的2 x 2矩阵表示只有有限数的无穷大矩阵(至少根据我的教授,他使用它的是什么)

我希望这有助于您更好地理解列表。像http://adv-r.had.co.nz/Data-structures.html这样的网站在将列表简单地称为向量时会出现拼写错误。我希望这清除了你对列表作为一维数据结构的困惑。

P.S。我也可以使用stackoverflow的格式化帮助。它有点压倒性。

    [1]: stackoverflow.com/questions/30007890/how-to-create-a-matrix-of-lists-in-r
    [2]: en.wikibooks.org/wiki/R_Programming/Data_types#Lists
    [3]: adv-r.had.co.nz/Data-structures.html
    [4]: www.r-bloggers.com/data-types-part-3-factors/
    [5]: www.tutorialspoint.com/r/r_data_types.htm
    [6]: www.stat.auckland.ac.nz/~paul/ItDT/HTML/node64.html#SECTION001345000000000000000
    [7]: https://ramnathv.github.io/pycon2014-r/learn/structures.html
相关问题