data.tables ile birleştirme

Iterator’un soru data.table deyimi hakkında bir sorum var a>. İşte bir örnek:

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 bu şekilde görünür

> 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

dt2 öğesindeki hangi satırların dt1 öğesinde aynı anahtara sahip olduğunu bulmak için hangi seçeneğini TRUE olarak ayarlayın:

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

Matthew, cevap ," katılmamak "deyimi

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

dt1 dt2 ' de görünmeyen dizinleri olan satırlara alt ayarlamak için. Makinemde data.table v1.7.1 olan bir hata alıyorum:

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

Bunun yerine, nomatch = 0 seçeneğiyle "non join" çalışır

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

Bu amaçlanan davranış mı?

14
Sadece v1.8.3'e eklenenler katılmamak sözdizimi. Bu durumda dt1 [! Dt2] . Detaylı bir cevap katacak ...
katma yazar Matt Dowle, kaynak

3 cevap

V1.8.3'teki yenilikler:

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
katma

Bildiğim kadarıyla, bu R üssünün bir parçası.

# 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

Metinsel hata mesajı, bunun amaçlanan davranış olduğunu olduğunu gösterir.

İşte amaçlanan davranış budur neden olarak benim en iyi tahminim:

Başka yerlerde NA 'ları gördükleri yöntemlerden (örneğin, genellikle na.rm = FALSE ' e varsayılan), R'nin tasarımcılarının NA 'olarak gördükleri görünüyor önemli bilgiler taşımak gibi s ve bunu yapmak için açık bir talimat olmadan bunu bırakmaktan nefret ediyorlar. (Neyse ki, nomatch = 0 değerini ayarlamak size bu talimatı vermeniz için temiz bir yol sunar!)

Bu bağlamda, tasarımcıların tercihi muhtemelen NA 'nin neden pozitif indeksleme için kabul edildiğini ancak negatif indeksleme için kabul edilmediğini açıklamaktadır:

# 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
katma

Data.table'ın 1.7.3 sürümündeki yenilikler:

Yeni seçenek datatable.nomatch , nomatch için varsayılanın   NA’dan 0’a değiştirildi, ...

2
katma
Bu değişiklik biraz yardımcı olabilir ama gerçekten 'katılmamak' için tasarlanmamıştır. FR # 1384 hala yapmak için. Birinin HABERLER olsa da okuduğunu görmek güzel :)
katma yazar Matt Dowle, kaynak