Umumiy koʻrinish
Men data.table
bilan nisbatan tanishman, dplyr
bilan unchalik emas. Men ba'zi dplyr
vinyetka va SO'da paydo bo'lgan misollarni o'qib chiqdim va hozirgacha mening xulosalar quyidagilar:
data.table
vadplyr
tezligi bo'yicha solishtirish mumkin, ko'p (ya'ni > 10-100K) guruhlar mavjud bo'lganda va ba'zi boshqa holatlar bundan mustasno (quyida ko'rsatkichlarga qarang)dplyr
sintaksisi yanada qulayroqdplyr
ma'lumotlar bazasining potentsial o'zaro ta'sirini ko'rsatadi (yoki bo'ladi).- Funktsionallik boʻyicha baʼzi kichik farqlar mavjud (quyida “Misollar/foydalanish” ga qarang)
Mening fikrimcha 2. unchalik og'irlik qilmaydi, chunki men u bilan yaxshi tanishman data.table
, lekin ikkalasini ham yangi foydalanuvchilar uchun bu katta omil bo'lishini tushunaman. Men qaysi biri intuitivroq ekanligi haqidagi bahsdan qochmoqchiman, chunki bu mening data.table
bilan tanish bo'lgan odamning nuqtai nazaridan berilgan maxsus savolim uchun ahamiyatsiz. Men, shuningdek, "intuitivroq" tezroq tahlilga qanday olib kelishi haqida munozaralardan qochishni xohlayman (albatta, to'g'ri, lekin bu erda meni eng ko'p qiziqtiradigan narsa emas).
Savol
Men bilmoqchi bo'lgan narsa:
- Paketlar bilan tanish bo'lgan odamlar uchun u yoki bu paket bilan kodlash ancha oson bo'lgan analitik vazifalar bormi (ya'ni, zarur bo'lgan klavishlarni bosish kombinatsiyasi va zarur ezoterizm darajasi, bunda har birining kamroq qismi yaxshi narsa).
- Bir paketda boshqasiga nisbatan sezilarli darajada (ya'ni 2x dan ortiq) samaraliroq bajariladigan analitik vazifalar bormi?
Bitta Oxirgi SO savoli meni o‘ylantirdi. Bu biroz ko'proq, chunki shu paytgacha men dplyr
data.table
da qila oladigan narsadan ko'proq narsani taklif qiladi deb o'ylamagan edim. Mana dplyr
yechim (Q oxiridagi ma'lumotlar):
dat %.%
group_by(name, job) %.%
filter(job != "Boss" | year == min(year)) %.%
mutate(cumu_job2 = cumsum(job2))
Bu mening data.table
yechimini buzishga urinishimdan ancha yaxshi edi. Ya'ni, yaxshi data.table
echimlar ham juda yaxshi (rahmat Jan-Robert, Arun va bu erda e'tibor bering, men eng maqbul echimdan ko'ra bitta bayonotni afzal ko'rdim):
setDT(dat)[,
.SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)],
by=list(id, job)
]
Ikkinchisining sintaksisi juda ezoterik ko'rinishi mumkin, lekin agar siz data.table
ga o'rganib qolgan bo'lsangiz (ya'ni, ba'zi ezoterik fokuslardan foydalanmasangiz) bu juda oddiy.
Ideal holda, men ko'rmoqchi bo'lgan yaxshi misollar: dplyr
yoki data.table
yo'l ancha ixchamroq yoki ancha yaxshi ishlaydi.
Misollar
Usagedplyr
ixtiyoriy qatorlar sonini qaytaradigan guruhlangan operatsiyalarga ruxsat bermaydi (eddi savoli, e'tibor bering: u dplyr 0.5shuningdek, @beginneR @eddining savoliga javobdado
yordamida potentsial echimni ko'rsatadi).data.table
aylanma ulanishlarni qo‘llab-quvvatlaydi (rahmat @dholstius) shuningdek qo'shilishdata.table
bir xil asosiy R sintaksisidan foydalangan holda ikkilik qidiruvdan foydalanadigan avtomatik indekslash orqali tezlik uchunDT[col == value]
yokiDT[col %in% values]
shaklidagi ifodalarni ichki optimallashtiradi. Batafsil ma'lumot va kichik mezon uchun bu yerga qarang.dplyr
funksiyalarning standart baholash versiyalarini (masalan,regroup
,summarize_each_
) taklif etadi, ulardplyr
dan dasturiy foydalanishni soddalashtiradi (eslatma:data.table
dan dasturiy foydalanish, albatta, mumkin, shunchaki ehtiyotkorlik bilan oʻylash, almashtirish/iqtibos keltirish va h.k., hech boʻlmaganda mening bilishimcha)
- Men o‘zimning shaxsiy ko‘rsatkichlarimni bajardim va har ikkala paketni "split application combine" uslubi tahlilida solishtirish mumkin deb topdi, bundan tashqari, juda ko'p sonli guruhlar (>100K) mavjud bo'lganda
data.table
sezilarli darajada tezlashadi. - @Arun ba'zi qo‘shilish bo‘yicha benchmarklarni bajarib,
data.table
ga qaraganda yaxshiroq shkala ekanligini ko‘rsatdi.dplyr
guruhlar soni ortib borishi bilan (har ikkala paketdagi so'nggi yaxshilanishlar va R ning so'nggi versiyasi bilan yangilangan). Bundan tashqari, noyob qiymatlarni olishga urinib ko‘ringdata.table
~6x tezroq. - (Tasdiqlanmagan) guruh/apply/sortning katta versiyalarida
data.table
75% tezroq,dplyr
kichikroq versiyalarida 40% tezroq (sharhlardan yana bir SO savol, rahmat danas). data.table
ning asosiy muallifi Mett guruhlash operatsiyalarini taqqoslagan.data.table
,dplyr
va pythonpandas
2 milliard qatorgacha (RAMda ~100 GB).- 80 ming guruhdagi eski mezon
data.table
~8 baravar tezroq
Ma'lumotlar
Bu savol bo'limida ko'rsatgan birinchi misol uchun.
dat <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L), name = c("Jane", "Jane", "Jane", "Jane",
"Jane", "Jane", "Jane", "Jane", "Bob", "Bob", "Bob", "Bob", "Bob",
"Bob", "Bob", "Bob"), year = c(1980L, 1981L, 1982L, 1983L, 1984L,
1985L, 1986L, 1987L, 1985L, 1986L, 1987L, 1988L, 1989L, 1990L,
1991L, 1992L), job = c("Manager", "Manager", "Manager", "Manager",
"Manager", "Manager", "Boss", "Boss", "Manager", "Manager", "Manager",
"Boss", "Boss", "Boss", "Boss", "Boss"), job2 = c(1L, 1L, 1L,
1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L)), .Names = c("id",
"name", "year", "job", "job2"), class = "data.frame", row.names = c(NA,
-16L))
dplyr
ni o'qishda o'xshash yechim:as.data.table(dat)[, .SD[job != "Boss" | year == min(year)][, cumjob := cumsum(job2)], by = list(name, job)]
- person eddi   schedule 29.01.2014dplyr
vadata.table
jamoalar sinovlar ustida ishlamoqda, shuning uchun javob bir nuqtada bo'ladi. №2 (sintaksis) imO mutlaqo noto'g'ri, lekin bu aniq fikr hududiga kiradi, shuning uchun men ham yopish uchun ovoz beraman. - person eddi   schedule 29.01.2014(d)plyr
da aniqroq ifodalangan muammolar to'plami 0 o'lchoviga ega - person eddi   schedule 29.01.2014dplyr
ni yaxshi bilmayman va kimdir yaxshi qarshi misol keltira oladimi, deb qiziqdim. Bundan tashqari,data.table
formulasini yaxshi soddalashtirish. - person BrodieG   schedule 29.01.2014plyr
vadata.table
haqida soʻragan stackoverflow.com/q/16153947/892313ga juda oʻxshaydi va u ham yopildi. U erda mening javobim nima uchun bu ko'proq ekanligini tushuntiradi. - person Brian Diggs   schedule 29.01.2014data.table
da aniqroq ifodalangan muammolar to'plami 0 o'lchoviga ega, ammo bu sizning e'tiqodingizga zid emas;) - person hadley   schedule 29.01.2014data.table
qo'shilmaydimi? Va (ehtimol, boshqa joyda aytib o'tilganlarni takrorlagan holda) qiziqarliroq ma'lumotlar o'lchamlari haqida nima deyish mumkin (bu erda men qiziqarli deganda bir daqiqadan ko'proq vaqt talab qiladigan narsa deb ta'riflagan bo'lardim - bu odatda odamlar paketlarning mezonlarini o'rganishni boshlashining asosiy sababidir)? - person eddi   schedule 30.01.2014dplyr
vaplyr
haqida haqiqatan ham bezovta qiladigan va ularning sintaksisini yoqtirmasligimning asosiy sababi shundaki, men juda ko'p (1 dan ortiq o'qing) qo'shimcha funktsiyalarni (nomlar bilan) o'rganishim kerak. buhali hammen uchun mantiqiy emas), ular nima qilishlarini, qanday dalillarni olishlarini va hokazolarni eslang. - person eddi   schedule 30.01.2014.SD
). [jiddiy] Menimcha, bu turli odamlarga yoqadigan qonuniy dizayn farqlari - person hadley   schedule 30.01.2014.SD
va boshqalar - bu adolatli -.SD
tushunish uchun menga bir oz vaqt kerak bo'ldi, lekin u erga etib borganimda, men allaqachon ko'p narsalarni qila oldim, shu bilan birga (d)plyr sizga katta to'siqni taqdim etadi. - person eddi   schedule 30.01.2014dplyr
vadata.table
ni solishtirishga misoldir. - person danas.zuokas   schedule 31.01.2014data.table
o'rganishni maslahat beraman, bu standart ma'lumotlar ramkasidan ancha kamroq va ko'p operatsiyalar tezroq. Bu sizni vektoriy fikrlash bilan o'ylashga majbur qiladi (yaxshiroq ishlashga ega). Men buni ma'lumotlar ramkasining yaxshi o'rnini bosuvchi sifatida ko'raman. Sintaksis dastlab intuitiv emas, lekin uni ishlatganingizdan so'ng uni eslab qolish oson. Mendplyr
ni funktsiyalar to'plami sifatida ko'raman, lekindata.table
an'anaviy ma'lumotlar ramkasidan ancha yaxshi ishlashi va ixcham sintaksisiga ega yangi sinf ob'ekti sifatida. - person David Leal   schedule 15.03.2017