子集行和列同时

MvG*_*MvG 6 r data.table

我对它的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
Run Code Online (Sandbox Code Playgroud)

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

是否有任何充分的理由为什么同时对行和列的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]
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 7

关于这个问题:

是否有任何充分的理由为什么同时对行和列的data.table进行子集化将始终包含键值以及计算结果?

我认为,(对我来说不够好)原因很简单,马修Dowle还没有尚未得到周围添加该选项(可能是因为他已经优先对工作有用得多的功能,如":与通过=").

我的答案之后的评论中,马修似乎表明它正在他的TODO名单上,并指出"[这]是什么drop=TRUE(加速时有加速作用)drop".

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

dt[list(12)][,b]
# [1] 22
dt[list(12)][[2]]
# [1] 22
dt[dt[list(12), which=TRUE], b]
# [1] 22
Run Code Online (Sandbox Code Playgroud)


nas*_*ddd 6

一种可能性是使用:

dt[a == 12]
Run Code Online (Sandbox Code Playgroud)

dt[a == 12, b]
Run Code Online (Sandbox Code Playgroud)

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


更新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).