【发布时间】:2016-11-10 20:24:11
【问题描述】:
有人可以向我解释一下matrix、data.frame 和data.table 在列引用方面的区别吗?我正在考虑每个类使用哪种语法,但我不明白它们如何/为什么不同。
取一个 10x10 的矩阵
foo <- matrix( nrow = 10, ncol = 10 )
我将仅填写第 2 列来演示:
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] 引用第二列,但foo[[2]] 只返回1 个单元格,在本例中为NA:
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
现在,如果我转换为 data.table,则只有第二种方法有效,第一种方法返回值 2(根本不在表中):
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
所以我的问题是,为什么不同的类有不同的语法?是否有适用于所有 3 个类的特定语法,或者我们是否需要在知道如何调用引用之前知道/检查表格类?
编辑:这里也很有趣的是行引用在类之间更加一致。
分别针对matrix、dataframe、data.table:
foo[2,]
[1] NA 0.4651124 NA NA NA NA NA NA NA NA
foo <- data.frame( foo )
foo[2,]
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
2 NA 0.4651124 NA NA NA NA NA NA NA NA
setDT( foo )
foo[2,]
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1: NA 0.4651124 NA NA NA NA NA NA NA NA
【问题讨论】:
-
您说得很好,尽管我很喜欢使用 R,但矩阵、data.frame 和 data.table 类型之间的单元格引用缺乏一致性令人沮丧,尤其是对于新用户而言。而且您甚至还没有列出清单……或者是吗? ;)
-
?"[["和?"["和?"[.data.frame"中有大量信息。你看了吗?至于data.table语法,据我所知,这纯粹是其主要作者的设计决定。另请注意,矩阵只是具有维度属性的向量,而 data.frame 基本上是list -
当涉及到不同数据类型的引用时,我发现 Hadley Wickham 的书“Advanced R”解释得很好。但是,它不涉及
data.tables。 -
“类”中使用的每个函数也都有各自的方法。某些类的
print方法重合(即“矩阵”、“data.frame”、“data.table”look 相似)这一事实并不意味着它们也将/ should/are-built-to 行为类似。您可以自己创建一个类似“矩阵”的类并定义/记录基本的[和[<-方法,这些方法将适合您的类。 -
@rosscova 所有这些实际上都是函数本身。
标签: r matrix dataframe data.table