列引用:[[i]] vs [,i]表示矩阵,数据帧和data.table

时间:2016-07-08 09:54:29

标签: r matrix dataframe data.table

有人可以向我解释product_imagematrixdata.frame之间的列引用的区别吗?我正在研究每个类使用哪种语法,但我不明白它们是如何/为什么不同。

采用10x10矩阵

data.table

我将填写第二栏来演示:

foo <- matrix( nrow = 10, ncol = 10 )

现在我可以使用foo[,2] <- rnorm(10) head( foo, 3 ) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] NA -0.4688874 NA NA NA NA NA NA NA NA [2,] NA -1.0273370 NA NA NA NA NA NA NA NA [3,] NA -0.3981627 NA NA NA NA NA NA NA NA 引用第二列,但foo[,2]只返回一个单元格,在本例中为NA:

foo[[2]]

如果我将矩阵更改为数据帧,则两种引用方法都有效:

foo[,2]
 [1]  0.18340527  0.46511236 -2.43277107  0.13260218  0.20227436 -0.57518392 -0.62211864  2.00239088  -0.09561907  0.67536428

foo[[2]]
  [1] NA

现在,如果我只转换为foo <- data.frame( foo ) foo[,2] [1] -0.4688874 -1.0273370 -0.3981627 -0.2207062 0.5711004 1.1085851 -1.3343338 0.2337622 -1.0632469 -0.9783714 foo[[2]] [1] -0.4688874 -1.0273370 -0.3981627 -0.2207062 0.5711004 1.1085851 -1.3343338 0.2337622 -1.0632469 -0.9783714 ,则第二种方法有效,第一种方法返回值2(根本不在表中):

data.table

所以我的问题是,为什么不同类的语法不同?是否有一个适用于所有3个类的特定语法,或者在知道如何调用引用之前我们是否需要知道/检查表格类?

编辑:这里有趣的是行引用在各个类中更加一致。

分别对于matrix,dataframe和data.table:

foo[,2]
  [1] 2
foo[[2]]
  [1] -0.4688874 -1.0273370 -0.3981627 -0.2207062  0.5711004  1.1085851 -1.3343338  0.2337622  -1.0632469 -0.9783714

1 个答案:

答案 0 :(得分:0)

自从在这里发布这个问题后我学到了一些东西(得到了评论者的大量帮助!),这些帮助我理解了我提到的差异。如果有人可以澄清我在这里遇到的任何问题,我会很感激:

  • matrixdata.framedata.table的对象都是list对象,但它们之间的区别很重要。

  • data.framedata.table对象的每一列都是“引擎盖下”列表中的一个元素,这意味着可以像列表元素一样提取列因此,foo[[2]]非常适合调用这两个类中的第二列。

  • matrix的不同之处在于每个单元格都是列表中的一个元素,这意味着foo[[2]]只会检索一个单元格,而不是一列(把我们带到......)。

  • 构成matrix的那些列表项按列“填充”(从上到下,从左到右),因此调用foo[[2]]正在检索第二个item,位于第1列的第2行。

  • 由于matrix也有维度,因此foo[,2]被视为引用第二列,与data.frame对象一样。

  • data.table对象(直到最近,见下一点)对调用foo[,2]没有特别合理的响应,并返回值2,而不管它所引用的数据,我找不到任何理由。

  • 截至data.table软件包的最新更新(从1.9.8开始,我认为?感谢维护者!)语法foo[,2]现在在逻辑上被接受为{{1因此导致我的问题的一些混乱已被取代!

总之:

  1. 我在问题中提到的所有对象实际上都是列表(这意味着我现在在评论中得到了@ N8TRO的笑话,之前我天真地忘记了它),data.frame和{{ 1}}包含每列的列表元素,以及包含每个单元格的列表元素的data.table(这使data.frame调用现在对我有意义。)

  2. 提到的所有对象都有维度,这意味着(截至最近的matrix包更新)[[语法对所有3个类的工作方式相同。 YAY!

  3. 非常感谢评论者指出我正确的方向(以及我现在开的笑话)。我希望这可能会帮助将来遇到同样困惑的人。