考虑以下
data.table
:
dt <- data.table(a = 1:5, b = 6:10, c = 11:15)
> dt
a b c
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14
5 5 10 15
来自常见问题小插图:
指的是第三行,但DT[3]
指的是第三列。DF[3]
DT[3, ] == DT[3]
同样,从 data.table 的介绍 小插图中,我们看到了
i 中的条件后不需要逗号
,即在没有逗号的情况下,默认索引是指
i
索引,即行。
我们想以编程方式访问
b
列,因此我们将字符串分配给变量colname <- "b"
。 但是,如果我们想得到列向量b
,我们可以使用以下任一种:
> dt[, ..colname][[1]]
[1] 6 7 8 9 10
> dt[,get(colname)]
[1] 6 7 8 9 10
> dt[[colname]]
[1] 6 7 8 9 10
前两个选项是有道理的,因为它们通过
j
索引访问列,因此它们包含一个逗号(尽管以一种稍微麻烦的方式)。 但是第三个选项是访问一列,没有任何逗号。 我无法从介绍性的 data.table 文档中理解这一点,发生了什么,这是需要的吗?
从 data.table 的介绍 小插图我们看到:
data.tables(和 data.frames)也是内部列表,与 规定每个元素具有相同的长度并且列表具有 类属性。
只要 j-expression 返回一个列表,列表中的每个元素都会被转换为结果 data.table 中的一列。
因此,作为列表方法的提取函数 (
[]
) 对于 data.table
应该同样有效。实际上,我们看到 data.table
和 list
对象都可以具有 names
属性。
我们首先创建一个可比较的列表对象
lst <- list(a = 1:5, b = 6:10, c = 11:15)
然后我们可以检查它们的属性:
> attributes(lst)
$names
[1] "a" "b" "c"
> attributes(dt)
$names
[1] "a" "b" "c"
$row.names
[1] 1 2 3 4 5
$class
[1] "data.table" "data.frame"
$.internal.selfref
<pointer: (nil)>
然后使用双方括号
[[]]
,我们可以通过整数或字符索引访问列表的元素。还要注意
对于需要计算表达式以找到索引的情况,请使用 x[[expr]]
,即我们可以使用将评估为整数或字符索引的表达式。这就是我们在这种情况下所做的,通过其名称属性(字符索引)访问列表的元素:
> lst[[colname]]
[1] 6 7 8 9 10
> dt[[colname]]
[1] 6 7 8 9 10
FAQ 1.2提到了这种情况并将其列为解决方案,但没有说明它是使用与data.table对象无关的extract函数的方法。我觉得这是文档中没有解释的调用范围的许多问题之一,这使得一开始就更难采用 data.table。