6

我对它的工作原理有点惊讶data.table

> library(data.table)
data.table 1.8.2  For help type: help("data.table")
> dt <- data.table(a=11:20, b=21:30, c=31:40, key="a")
> dt[list(12)]
    a  b  c
1: 12 22 32
> dt[list(12), b]
    a  b
1: 12 22
> dt[list(12)][,b]
[1] 22

我想要做的是在与选择匹配的行中获取单个列(或表达式)的值。我看到我必须将键作为列表传递,因为原始数字表示行号而不是键值。所以上面的第一个对我来说很清楚。但是为什么第二个和第三个子集表达式产生不同的结果对我来说似乎相当混乱。我想得到第三个结果,但希望能够以第二种方式编写它。

有什么好的理由为什么同时为行和列设置一个 data.table 子集总是包括键值和计算结果?除了上面的双子集之外,是否有一种语法上更短的方法来获得单个结果?

我在 R 2.15.1 上使用 data.table 1.8.2。如果你不能重现我的例子,你不妨考虑一个因素作为关键:

dt <- data.table(a=paste("a", 11:20, sep=""), b=21:30, c=31:40, key="a")
dt["a11", b]
4

2 回答 2

7

关于这个问题:

有什么好的理由为什么同时为行和列设置一个 data.table 子集总是包括键值和计算结果?

我相信(对我来说足够好)的原因仅仅是 Matthew Dowle 还没有开始添加该选项(可能是因为他优先考虑了更有用的功能,例如“:= with by”)。

我在此处回答之后的评论中,Matthew 似乎表明它在他的 TODO 列表中,并指出“[this] 是添加drop=TRUE时将执行的操作(具有速度优势)drop”。

在此之前,以下任何一项都可以完成工作:

dt[list(12)][,b]
# [1] 22
dt[list(12)][[2]]
# [1] 22
dt[dt[list(12), which=TRUE], b]
# [1] 22
于 2012-08-04T05:48:27.423 回答
6

一种可能性是使用:

dt[a == 12]

dt[a == 12, b]

这将按预期工作,但它会阻止二进制搜索并需要顺序搜索(是否有计划改变这种行为??),使其可能更慢。


2014 年 9 月更新:现在在 v1.9.3

来自新闻:

DT[column==values]现在已优化为在DT时使用 的键key(DT)[1]=="column",否则会自动添加辅助键(又名索引),因此下一个键DT[column==values]要快得多。DT[column %in% values]是等价的;即,两者都==接受%in%向量值。无需更改代码;现有代码应该自动受益。可以使用手动添加辅助键set2key()并使用key2(). 这些优化和函数名称/参数是实验性的,可以使用options(datatable.auto.index=FALSE).

于 2012-08-03T12:39:38.860 回答