R-dataframlarni oldindan tartiblangan ustunga birlashtirish kerakmi?

Men odatda juda yaxshi tartiblangan (yoki osonlik bilan tartiblangan) katta dataframlar bilan ishlayman.

Ikki dataframni hisobga olgan holda, "foydalanuvchi"

some.data    
user   

Va m = birlashma (some.data, user) ni ishlataman, natijani quyidagicha qabul qilaman:

m =     

Va bu juda yaxshi.

Lekin birlashma bu dataframlardan umumiy sütunlarda tartiblangan CPU/xotira og'ir birlashma qilishni afzal ko'rmaydi. Biroq, bu birlashma O (n)

Men R-da tartiblangan ma'lumotlar to'plamiga samarali birlashish uchun yo'l bormi, deb o'ylayman?

6
Agar men qo'shimcha narsani qo'shishga imkon berolmasam, Nikning fikri - men taklif qilaman. Faqatgina boshqa narsa shundaki, undagi ishlarni amalga oshirishda foydalanilmayotgan yoki keraksiz o'zgaruvchini yo'qotish yaxshiroqdir: siz yangi ma'lumotlar ramkasini yaratishda shu qadar ko'proq ma'lumotlarga ega bo'lishingiz kerak. Ma'lumotlar doirasidagi (yoki ma'lumotlar jadvali) vaqtinchalik o'zgaruvchilarni tez-tez yarataman va ob'ektlarni birlashtirish yoki tartiblashdan oldin ularni (masalan, myDT $ tmpVar = NULL ) nuke qilaman.
qo'shib qo'ydi muallif Iterator, manba

2 javoblar

Menda hech qanday tajriba yo'q, lekin men bilganimdek, bu data.table to'plamini yaxshilash uchun ishlab chiqilgan masalalardan biri.

Ko'p amaliy maqsadlar uchun data.table = data.frame + indeks . Natijada, to'g'ri ishlatilganda, bu juda katta operatsiyalarning ish faoliyatini oshiradi.

data.table data.table data.frame (masalan, indeksni qo'shish) ga aylantirish xavfi bor (bu yaxshi optimallashishini kutmoqchi bo'lsam ham) Lekin siz uni to'ldirganingizdan so'ng, birlashma kabi vazifalar yaxshi ishlash uchun indeksni osongina ishlatishi mumkin.

5
qo'shib qo'ydi
Bu yaxshi javob. Aniqlash uchun: indeksni qo'shib qo'yish haqiqatda yuzaga kelmaydi - data.table tugmachalarini yaratish uchun ma'lumotlarni ishlatadi (tamsayılar yoki tamsayılar soni bilan cheklangan bo'lsa ham, AFAIK). Buni amalga oshirish uchun, bu ma'lumotlarni o'zgaruvchilar tugmachasi bilan tartiblaydi. Ma'lumotlar allaqachon ushbu kalitlarga ko'ra tartiblangan bo'lsa, unda barcha turlar juda tez. Biroq kalitlarni ko'rsatishni shart emas - biroq birlashma dan foydalanishingiz mumkin.
qo'shib qo'ydi muallif Iterator, manba
(Davomi) Ushbu va boshqa sabablarga ko'ra tezlik bilan bog'liq barcha ma'lumotlar jadvallariga ko'plab ma'lumotlar kvadratlarini almashtirdim va bunga afsuslanmadim - bu tez va men uni 10 yoki shunga o'xshash alternativlarga nisbatan taqqosladim. Undan tashqari, men C yoki C ++ da juda ko'p kod yozishni istagan bo'lardim. (Men yuborgan bir qancha savollarga qarash, bu jarayonni ancha aniq amalga oshiradi ;-))
qo'shib qo'ydi muallif Iterator, manba

Agar umumiy kalitlar/indekslar to'plamingiz mutlaqo bir-biriga mos tushmasa, ya'ni ...

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

... ROST qaytaradi va siz aytganingizdek, tartiblangan, va kalit echimlari mavjud emas, keyin sizning birlashma muammosi data.frame ustunlarini qo'shish uchun kamayadi. Yo'nalishdagi narsalar ...

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))

Yuqoridagi varsayımlar tutulmazsa, u har ikkala kalit majmui, tarjima funktsiyasi, NA padding birlashmasini birlashtiradi, biroq, birlashma va bir-biriga bog'lab turadigan taxmin faqat uzoq yo'lni oladi.

System.time() va faqat bir marta chaqiradigan birlashma() vaqtidan farqli o'laroq, Sys.time() ni ikki marta chaqirganidan keyin sekundlarga yaqinlashuvning vaqti belgilanadi. (S.O.ni belgilash uchun o'pkadan foydalanishni kechir)

0
qo'shib qo'ydi