Önceden sıralanmış bir sütunda R'deki dataframes birleştirme?

Genellikle oldukça iyi sıralanmış (veya kolayca sıralanabilir) olan büyük veri kareleriyle çalışırım.

İki kullanıcı çerçevesi verildiğinde, her ikisi de 'kullanıcı' ile sıralanır

some.data    
user   

Ve ben m = birleştirme (some.data, kullanıcı) çalıştırıyorum, sonucu şu şekilde alırım:

m =     

Ve bu da öyle.

Ancak birleştirme , bu veri çerçevelerinden yararlanarak, sıradan CPU/bellek ağırlığını birleştiren ortak sütun üzerinde sıralanır. Ancak, bu birleştirme O (n) 'de yapılabilir

R'de sıralanmış veri kümelerinde verimli birleştirme yapmak için bir yol olup olmadığını merak ediyorum?

6
Ekleyeceğim daha somut bir şeyle gelemediğim sürece, Nick'in cevabı önereceğim şeydir. Diğer tek şey, birleştirmeler yaparken kullanılmayan veya gereksiz değişkenleri temizlemenin iyi olması: yeni veri çerçevesini oluştururken o kadar çok veriyi dolaşmanız gerekiyor. Genellikle bir veri çerçevesinde (veya veri tablosunda) geçici değişkenler oluşturur ve nesneleri birleştirmeden veya ayırmadan önce bunları (örneğin myDT $ tmpVar = NULL ) nükleer olarak yaparım.
katma yazar Iterator, kaynak

2 cevap

Bununla ilgili herhangi bir deneyimim yok, ancak bildiğim kadarıyla, bu data.table paketinin geliştirilmek üzere tasarlandığı konulardan biri.

En pratik amaçlar için data.table = data.frame + index . Sonuç olarak, doğru kullanıldığında, bu, birkaç büyük işlemin performansını artırır.

data.frame komutunuzun bir data.table 'a (yani endeksin eklenmesi) geçmesi biraz zaman alabilir (bunun iyi bir şekilde optimize edilmesini beklemesine rağmen), ama bir kez aldığınızda, birleştirme gibi işlevler daha iyi performans için endeksi kolayca kullanabilir.

5
katma
Bu iyi bir cevap. Açıklığa kavuşturmak için: dizinin eklenmesi gerçekten gerçekleşmez - data.table anahtarlar oluşturmak için verileri kullanır (tamsayılarla veya tamsayılarla sınırlı olsa da, AFAIK). Bunu yapmak için, verileri belirtilen değişkenleri ile sıralar. Veri zaten bu anahtarlar tarafından daha çok sıralanırsa, tam sıralama oldukça hızlıdır. Bununla birlikte, tuşların belirtilmesi zorunlu değildir - biri birleştirme 'yi kullanmaya devam edebilir.
katma yazar Iterator, kaynak
(Devamı) Hızla ilgili bu ve diğer nedenlerden ötürü, kısa bir süre önce veri tablolarına çok fazla veri karesini değiştirdim ve pişman olmadım - bu hızlı ve 10 ya da daha fazla alternatife göre karşılaştırdım. Bu olmadan, C veya C ++ 'da onunla ne yapabileceğimin sadece bir kısmını yapmak için çok fazla kod yazıyordum. (Gönderdiğim bir grup soruya bir bakış, bu öğrenme sürecini oldukça açık hale getirecektir. ;-))
katma yazar Iterator, kaynak

Ortak anahtar/dizin kümeniz tamamen çakışıyorsa, bu ...

Reduce(`&`, user$user.id %in% some.data$user.id)

... TRUE değerini döndürür ve sizin de belirttiğiniz gibi, sıralanırlar, ve anahtar çoğaltmaları yoktur sonra birleştirme sorununuzu bir data.frame'e sütun eklemesine indirgenir. Çizgilerdeki bir şey ...

library(log4r)

t1 <- system.time(z <- merge(user, some.data, by='user.id'))

info(my.logger, paste('Elapsed time with merge():', t1['elapsed']))

t2 <- Sys.time()

r <- data.frame(user.id=user$user.id, V1.x=user$V1, V2.x=user$V2)

r[,names(some.data)] <- some.data[,names(some.data)

t3 <- Sys.time()

info(my.logger, paste('Elapsed time without:', t3-t2))

Yukarıdaki varsayımlar tutmazsa, her iki anahtar kümesinin, çeviri işlevinin, NA dolgularının biraz daha karışık bir şekilde ayarlanmasını sağlar. Ancak, birleştirme ve örtüşen varsayım tek başına uzun bir yol alır.

Ayrıca, saniye yaklaşımının zamanlaması, sistem.time() ve yalnızca bir kez çağrılan birleştirme() zamanlamasından farklı olarak Sys.time() işlevini çağırdığından beri önyargılıdır. (Özür dilerim S.O.'un işaretli kullanımı)

0
katma