我对它的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)
关于这个问题:
是否有任何充分的理由为什么同时对行和列的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)
一种可能性是使用:
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).