如何通过在R中的data.table索引来执行逻辑运算符?

Dan*_*iel 5 indexing r key logical-operators data.table

我试图找出我如何执行logical operators,当我使用索引data.table packageR

以下是示例.我datatable命名为dt.然后把它var2作为我的关键datatable:

> dt = data.table(var1 = rep(LETTERS[1:5],2), var2 = seq(1,20, 2), var3 = ceiling(rnorm(10, 3, 2)))
> dt
    var1 var2 var3
 1:    A    1    5
 2:    B    3    3
 3:    C    5    0
 4:    D    7    6
 5:    E    9    3
 6:    A   11    4
 7:    B   13    2
 8:    C   15    1
 9:    D   17    3
10:    E   19    7

> setkey(dt, var2)
Run Code Online (Sandbox Code Playgroud)

所以现在我想找出我的所有已定义的值key (var2)它们less than 10 ( <10).做以下尝试给我errors.

> dt[ < 10]
Error: unexpected '<' in "dt[ <"
> dt[ .< 10]
Error in eval(expr, envir, enclos) : object '.' not found
> dt[ .(< 10)]
Run Code Online (Sandbox Code Playgroud)

我的期望是:

     var1 var2 var3

 1:    A   11    4
 2:    B   13    2
 3:    C   15    1
 4:    D   17    3
 5:    E   19    7
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我知道只要这样做dt[var2 <10]我就会得到结果.但请考虑我想要获得索引的概念data.table并理解并知道如何在不调用key(var2)每个命令的情况下执行此操作!

任何有关解释的帮助都非常感谢.

Gre*_*gor 3

从 中?setkeykey(dt)获取字符向量中的关键列。假设您的表只有一个键列,那么您可以通过以下方式获得您想要的内容:

dt[dt[[key(dt)]] < 10]
Run Code Online (Sandbox Code Playgroud)

感谢 David Arenburg,您还可以使用get()

dt[get(key(dt)) < 10]
Run Code Online (Sandbox Code Playgroud)

这有点短,可能是要走的路。

我能想到的另一种方法更糟糕:

dt[eval(parse(text = paste(key(dt), "< 10")))]
Run Code Online (Sandbox Code Playgroud)

  • 还有 `dt[get(key(dt)) &lt; 10]` 和 `dt[eval(as.name(key(dt))) &lt; 10]` (3认同)