data.table:为什么没有逗号的双方括号子集指的是列而不是行(即 DT[[3]] == DF[, 3] == DF[[3]])?

问题描述 投票:0回答:1

考虑以下

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 文档中理解这一点,发生了什么,这是需要的吗?

r list data.table subset
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.