。次に例を示します。 library(data.table) dt1 dt2 A1 B1 A2 B2 [1,] a 1 [1,] a 2 [2,] b 4 [2,] b 5 [3,] c 2 [3,] c 2 [4,] "> 。次に例を示します。 library(data.table) dt1 dt2 A1 B1 A2 B2 [1,] a 1 [1,] a 2 [2,] b 4 [2,] b 5 [3,] c 2 [3,] c 2 [4,] "> 。次に例を示します。 library(data.table) dt1 dt2 A1 B1 A2 B2 [1,] a 1 [1,] a 2 [2,] b 4 [2,] b 5 [3,] c 2 [3,] c 2 [4,] " />

data.tablesとの非結合

私はIteratorの質問のイニシアチブに触発されている "非結合"のための data.table a>。次に例を示します。

library(data.table)

dt1 <- data.table(A1=letters[1:10], B1=sample(1:5,10, replace=TRUE))
dt2 <- data.table(A2=letters[c(1:5, 11:15)], B2=sample(1:5,10, replace=TRUE))

setkey(dt1, A1)
setkey(dt2, A2)

data.table は次のようになります

> dt1               > dt2
      A1 B1               A2 B2
 [1,]  a  1          [1,]  a  2
 [2,]  b  4          [2,]  b  5
 [3,]  c  2          [3,]  c  2
 [4,]  d  5          [4,]  d  1
 [5,]  e  1          [5,]  e  1
 [6,]  f  2          [6,]  k  5
 [7,]  g  3          [7,]  l  2
 [8,]  h  3          [8,]  m  4
 [9,]  i  2          [9,]  n  1
[10,]  j  4         [10,]  o  1

dt1 に同じキーを持つ dt2 の行を見つけるには、 オプションを TRUE

> dt1[dt2, which=TRUE]
[1]  1  2  3  4  5 NA NA NA NA NA

Matthewはこの答え、それは"非結合 "イディオム

dt1[-dt1[dt2, which=TRUE]]

dt2 に表示されないインデックスを持つ行に dt1 をサブセット化します。 data.table v1.7.1のマシンでエラーが表示される:

Error in `[.default`(x[[s]], irows): only 0's may be mixed with negative subscripts

代わりに、オプション nomatch = 0 を使用すると、「非結合」が機能します

> dt1[-dt1[dt2, which=TRUE, nomatch=0]]
     A1 B1
[1,]  f  2
[2,]  g  3
[3,]  h  3
[4,]  i  2
[5,]  j  4

これは意図された動作ですか?

14
v1.8.3に追加されたのは not-join の構文です。この場合、 dt1 [!dt2] 。詳細な回答を追加します...
追加された 著者 Matt Dowle,

3 答え

v1.8.3の新機能:

A new "!" prefix on i signals 'not-join' (a.k.a. 'not-where'), #1384.
  DT[-DT["a", which=TRUE, nomatch=0]]   # old not-join idiom, still works
  DT[!"a"]                              # same result, now preferred.
  DT[!J(6),...]                         # !J == not-join
  DT[!2:3,...]                          # ! on all types of i
  DT[colA!=6L | colB!=23L,...]          # multiple vector scanning approach
  DT[!J(6L,23L)]                        # same result, faster binary search
'!' has been used rather than '-' :
  * to match the 'not-join' and 'not-where' nomenclature
  * with '-', DT[-0] would return DT rather than DT[0] and not be backwards
    compatibile. With '!', DT[!0] returns DT both before (since !0 is TRUE in
    base R) and after this new feature.
  * to leave DT[+...] and DT[-...] available for future use
17
追加された

私が知る限り、これはベースRの一部です。

# This works
(1:4)[c(-2,-3)]

# But this gives you the same error you described above
(1:4)[c(-2, -3, NA)]
# Error in (1:4)[c(-2, -3, NA)] : 
#   only 0's may be mixed with negative subscripts

テキストのエラーメッセージは、意図した動作であることを示します

理由が意図された動作であることを推測します。

NA を別の場所(例えば、通常は na.rm = FALSE )に設定しているような扱い方から、Rの設計者は NA 重要な情報を運ぶものとして扱われています。 (幸いにも、 nomatch = 0 を設定すると、その命令を一緒に渡すことができます)。

この文脈では、デザイナーの好みはおそらく NA が肯定的な索引付けには受け入れられるが否定的な索引付けには受け入れられない理由を説明するでしょう。

# Positive indexing: works, because the return value retains info about NA's
(1:4)[c(2,3,NA)]

# Negative indexing: doesn't work, because it can't easily retain such info
(1:4)[c(-2,-3,NA)]
5
追加された
+1良い答え!はい、それはベースからです。 FR#1384 X [-Y] という構文を 'not join'とすることです。その間、 = TRUE、nomatch = 0 が必要です。
追加された 著者 Matt Dowle,

data.tableのバージョン1.7.3の新機能:

新しいオプション datatable.nomatch は、nomatchのデフォルトを   NAから0に変更されました。

2
追加された
その変更はちょっと役立つかもしれませんが、本当に「参加しない」ことを意図していませんでした。 FR#1384 はまだやりなさい。誰かがニュースを読むのを見てうれしい:)
追加された 著者 Matt Dowle,