有人可以向我解释product_image
,matrix
和data.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
答案 0 :(得分:0)
自从在这里发布这个问题后我学到了一些东西(得到了评论者的大量帮助!),这些帮助我理解了我提到的差异。如果有人可以澄清我在这里遇到的任何问题,我会很感激:
类matrix
,data.frame
和data.table
的对象都是list
对象,但它们之间的区别很重要。
data.frame
或data.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因此导致我的问题的一些混乱已被取代!
总之:
我在问题中提到的所有对象实际上都是列表(这意味着我现在在评论中得到了@ N8TRO的笑话,之前我天真地忘记了它),data.frame
和{{ 1}}包含每列的列表元素,以及包含每个单元格的列表元素的data.table
(这使data.frame
调用现在对我有意义。)
提到的所有对象都有维度,这意味着(截至最近的matrix
包更新)[[
语法对所有3个类的工作方式相同。 YAY!
非常感谢评论者指出我正确的方向(以及我现在开的笑话)。我希望这可能会帮助将来遇到同样困惑的人。