29

data.table論理列があります。i論理列の名前を引数に直接使用できないのはなぜですか? 例を参照してください。

dt <- data.table(x = c(T, T, F, T), y = 1:4)

# Works
dt[dt$x]
dt[!dt$x]

# Works
dt[x == T]
dt[x == F]

# Does not work
dt[x]
dt[!x]
4

3 に答える 3

31

から?data.table

高度:iが単一の変数名の場合、列名の式とは見なされず、呼び出しスコープで評価されます。

したがって、呼び出しスコープ(この場合はグローバル環境)でdt[x]評価しようとしますx

(または{またはを使用してこれを回避できます。force

dt[(x)]
dt[{x}]
dt[force(x)]
于 2013-04-24T12:13:21.207 に答える
4

xグローバル環境で定義されていません。これを試してみると、

> with(dt, dt[x])
      x y
1: TRUE 1
2: TRUE 2
3: TRUE 4

それはうまくいくでしょう。またはこれ:

> attach(dt)
> dt[!x]
       x y
1: FALSE 3

編集:

ドキュメントによると、jパラメーターは実際には列名を取ります:

> dt[x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[j = x]
[1]  TRUE  TRUE FALSE  TRUE

次に、iパラメーターは数値式または論理式のいずれかを取ります (x 自体のように) x

> dt[i = x]
Error in eval(expr, envir, enclos) : object 'x' not found
> dt[i = as.logical(x)]
      x y
1: TRUE 1
2: TRUE 2
3: TRUE 4
于 2013-04-24T11:47:59.777 に答える
2

これも機能するはずであり、間違いなくより自然です。

setkey(dt, x)
dt[J(TRUE)]
dt[J(FALSE)]
于 2014-02-10T11:42:48.637 に答える