4

dtルックアップ テーブルに従って変数を作成したいと思いますk。で対象の変数を抽出する方法によっては、予期しない結果が得られkます。

dt <- data.table(x=c(1:10))
setkey(dt, x)

k <- data.table(x=c(1:5,10), b=c(letters[1:5], "d"))
setkey(k, x)

dt[,b:=k[.BY, list(b)],by=x]

dt  #unexpected results
#      x  b
#  1:  1  1
#  2:  2  2
#  3:  3  3
#  4:  4  4
#  5:  5  5
#  6:  6  6
#  7:  7  7
#  8:  8  8
#  9:  9  9
# 10: 10 10

dt <- data.table(x=c(1:10))
setkey(x, x)

dt[,b:=k[.BY]$b,by=x]

dt  #expected results
#      x  b
#  1:  1  a
#  2:  2  b
#  3:  3  c
#  4:  4  d
#  5:  5  e
#  6:  6 NA
#  7:  7 NA
#  8:  8 NA
#  9:  9 NA
# 10: 10  d

なぜこれが起こっているのか誰でも説明できますか?

4

1 に答える 1

3

ここを使う必要はまったくありませんby=.

最初の解決策:

適切なキーを設定し、次の X[Y] 構文を使用しますdata.table

require(data.table)
dt <- data.table(x=c(1:10))
setkey(dt, "x")
k <- data.table(x=c(1:5,10), b=c(letters[1:5], "d"))
setkey(k, "x")

k[dt]

#      x  b
#  1:  1  a
#  2:  2  b
#  3:  3  c
#  4:  4  d
#  5:  5  e
#  6:  6 NA
#  7:  7 NA
#  8:  8 NA
#  9:  9 NA
# 10: 10  d

OPは、これにより新しいdata.tableが作成され、彼にとって望ましくないと言いました。

2 番目の解決策

繰り返しますが、なしby:

dt <- data.table(x=c(1:10))
setkey(dt, "x")
k <- data.table(x=c(1:5,10), b=c(letters[1:5], "d"))
setkey(k, "x")

# solution
dt[k, b := i.b]

これは新しいものを作成せず、data.table期待するソリューションを提供します。

予期しない結果が発生する理由を説明するには:

最初のケースでは、dt[,b:=k[.BY, list(b)],by=x]. ここでは、k[.BY, list(b)]それ自体が a を返しますdata.table。例えば:

k[list(x=1), list(b)]

#    x b
# 1: 1 a

したがって、基本的には、次のようにします。

k[list(x=dt$x), list(b)]

それはあなたにも望ましい解決策を与えるでしょう。b := k[.BY, list(b)]RHS は a を返し、data.tableそれに変数を割り当てているため、最初の要素を取り、残りを削除します。たとえば、次のようにします。

dt[, c := dt[1], by=x] 
# you'll get the whole column to be 1

2 番目のケースの場合data.table、なぜそれが機能するのかを理解するには、 ask[6]とへのアクセスの微妙な違いを知っておく必要があります。k[list(6)]次に例を示します。

最初のケース ではk[6]、 の 6 番目の要素である にアクセスしてk10 dます。しかし、2 番目のケースでは、J, join. したがって、x = 6 (キー列) を検索し、 には何もないためk、 を返します6 NA。あなたの場合、k[.BY]リストを返すを使用するためJ、これは正しい値を取得する操作です。

これが役立つことを願っています。

于 2013-02-27T20:26:07.420 に答える