SORU
7 EKİM 2012, Pazar


Neden X[Y] veri katıl.tablolar bir tam dış birleştirmek izin, ya da bir sol katılın?

Bu veri hakkında felsefi bir soru oldu.tablo sözdizimi katıl. Veri için daha fazla kullanır buluyorum.tablolar, ama hala öğrenme...

Veri için X[Y] biçim katıl.tablolar çok basit, kullanışlı ve verimli, ama görebildiğim kadarıyla, sadece iç birleştirme destekler ve sağ dış birleşimler. Sol veya tam dış birleştirme için, birleştirme kullanmak istiyorum:

  • X[Y,nomatch=NA] -- Y -- sağ dış birleştirme tüm satırları (varsayılan)
  • X[Y,nomatch=0] -- X ve Y -- iç hem de kibritle tek satır katılmak
  • merge(X,Y,all=TRUE) -- X ve Y -- hem de tam dış tüm satırları katıl
  • merge(X,Y,all.x=TRUE) -- X -- tüm satırları sol dış birleştirme

X[Y] katıldığında her 4 tür desteklenen biçim katılın kullanışlı olurdu gibi geliyor bana. Birleşimler sadece iki tip desteklenen bir nedeni var mı?

Benim için, "nomatch=0" ve "nomatch=" parametre değerleri gerçekleştirilen eylemler için çok kolay değil. NA Beni anlıyor ve sözdizimi birleştirme hatırlamak daha kolaydır: "tüm=", ". DOĞRU x=GERÇEK" ve ".=TRUE". y [Y] X işlemi çok daha fazla maç daha birleştirme benzer beri, neden maç yerine birleşimler için sözdizimi birleştirme işlevinin nomatch parametre kullanmıyorsun?

Burada 4 birleşim türleri kod örnekleri:

# sample X and Y data.tables
library(data.table)
X <- data.table(t=1:4,a=(1:4)^2)
setkey(X,t)
X
#   t  a
# 1: 1  1
# 2: 2  4
# 3: 3  9
# 4: 4 16
Y <- data.table(t=3:6,b=(3:6)^2)
setkey(Y,t)
Y
#    t  b
# 1: 3  9
# 2: 4 16
# 3: 5 25
# 4: 6 36

# all rows from Y - right outer join
X[Y]  # default
#  t  a  b
# 1: 3  9  9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
X[Y,nomatch=NA]  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
merge(X,Y,by="t",all.y=TRUE)  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
identical( X[Y], merge(X,Y,by="t",all.y=TRUE) )
# [1] TRUE

# only rows in both X and Y - inner join
X[Y,nomatch=0]  
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16
merge(X,Y,by="t")  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16
merge(X,Y,by="t",all=FALSE)  # same as above
#    t  a  b
# 1: 3  9  9
# 2: 4 16 16
identical( X[Y,nomatch=0], merge(X,Y,by="t",all=FALSE) )
# [1] TRUE

# all rows from X - left outer join
merge(X,Y,by="t",all.x=TRUE)
#    t  a  b
# 1: 1  1 NA
# 2: 2  4 NA
# 3: 3  9  9
# 4: 4 16 16

# all rows from both X and Y - full outer join
merge(X,Y,by="t",all=TRUE)
#    t  a  b
# 1: 1  1 NA
# 2: 2  4 NA
# 3: 3  9  9
# 4: 4 16 16
# 5: 5 NA 25
# 6: 6 NA 36

CEVAP
8 EKİM 2012, PAZARTESİ


Verilerden alıntı.tablo SSS 1.12

1.12

X[Y] ve birleştirme(X,Y) arasındaki fark nedir?

  • X[Y] birleştirme, X satır ararken bir indeks olarak kullanarak Y (veya Y anahtarı var).
  • Y[X] katılın, Y satır X (ya da eğer varsa X tuşu) kullanarak bakıyor
  • merge(X,Y) aynı anda her iki yönde yapıyor.

X[Y] Y[X] satır sayısı genellikle; sayısı ise farklı satır merge(X,Y) merge(Y,X) tarafından döndürülen aynı. AMA özlüyor ana noktası. En görevleri bir şeyler yapmış olması gerekir bir katılmak ya da birleştirme verileri. Neden tüm veri sütunları, sadece birleştirme onlara küçük bir kısmını daha sonra kullanmak? Sana tavsiyem ... merge(X[,ColsNeeded1],Y[,ColsNeeded2]) ama kopyasını alır alt programcı hangi iş için gerekli veri setleri, ve sütunlar ihtiyaç vardır. Veri X[Y,j].tablo her bir adım için yapar sana. X[Y,sum(foo*bar)] veri yazmak.tablo otomatik olarak inceler j ifadeyi kullanır. Tek bu sütunlar sadece alt; Diğerleri göz ardı edilir. Bellek sadece j kullanır sütunları için oluşturulmuş ve Y sütunları standart R zevk her grup kapsamında geri dönüşüm kuralları. Hadi foo ki X, Y ve bar (Y 20 diğer sütunlar ile birlikte). Değil Program X[Y,sum(foo*bar)] daha hızlı ve bir birleştirme daha çalıştırmak için daha hızlı alt? izledi

Ben bir sol dış birleşim X[Y] istediğiniz

le <- Y[X]
mallx <- merge(X,Y, all.x = T)
# the column order is different so change to be the same as `merge`
setcolorder(le, names(mallx))
identical(le,mallx)
# [1] TRUE

Eğer isterseniz, bir tam dış birleştirmek

# the unique values for the keys over both data sets
unique_keys <- unique(c(X[,t], Y[,t]))
Y[X[J(unique_keys)]]
##   t  b  a
## 1: 1 NA  1
## 2: 2 NA  4
## 3: 3  9  9
## 4: 4 16 16
## 5: 5 25 NA
## 6: 6 36 NA

# The following will give the same with the column order X,Y
X[Y[J(unique_keys)]]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DetroitBORG

    DetroitBORG

    29 Temmuz 2008
  • HTC

    HTC

    12 Ocak 2006
  • KIT KAT

    KIT KAT

    3 EKİM 2005