【发布时间】:2012-08-03 12:05:07
【问题描述】:
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]
【问题讨论】:
-
我无法运行
dt[list(12)]:错误:Error in `[.data.table`(dt, list(12)) : typeof x.a (integer) != typeof i.V1 (double)。我使用 data.table 版本 1.8.0 -
但这有效并且非常清楚:
dt[a == 12]和dt[a == 12, b] -
@cafe876,我相信 data.table 手册建议不要使用这种语法,因为它会阻止二进制搜索并需要顺序搜索。仍然是一个很好的语法,性能不是很重要,所以也许你最好把这个评论变成一个答案。
-
关于我的第一条评论:在 data.table 1.8.0 中,
dt[J(12)]在您的示例中执行dt[list(12)]的操作,但添加“indx”列略有不同...跨度>
标签: r data.table