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.tablevadplyrtezligi 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)dplyrsintaksisi yanada qulayroqdplyrma'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
Usagedplyrixtiyoriy qatorlar sonini qaytaradigan guruhlangan operatsiyalarga ruxsat bermaydi (eddi savoli, e'tibor bering: u dplyr 0.5shuningdek, @beginneR @eddining savoliga javobdadoyordamida potentsial echimni ko'rsatadi).data.tableaylanma ulanishlarni qo‘llab-quvvatlaydi (rahmat @dholstius) shuningdek qo'shilishdata.tablebir 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.dplyrfunksiyalarning standart baholash versiyalarini (masalan,regroup,summarize_each_) taklif etadi, ulardplyrdan dasturiy foydalanishni soddalashtiradi (eslatma:data.tabledan 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.tablesezilarli darajada tezlashadi. - @Arun ba'zi qo‘shilish bo‘yicha benchmarklarni bajarib,
data.tablega qaraganda yaxshiroq shkala ekanligini ko‘rsatdi.dplyrguruhlar 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.table75% tezroq,dplyrkichikroq versiyalarida 40% tezroq (sharhlardan yana bir SO savol, rahmat danas). data.tablening asosiy muallifi Mett guruhlash operatsiyalarini taqqoslagan.data.table,dplyrva pythonpandas2 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))
dplyrni 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.2014dplyrvadata.tablejamoalar 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)plyrda aniqroq ifodalangan muammolar to'plami 0 o'lchoviga ega - person eddi   schedule 29.01.2014dplyrni yaxshi bilmayman va kimdir yaxshi qarshi misol keltira oladimi, deb qiziqdim. Bundan tashqari,data.tableformulasini yaxshi soddalashtirish. - person BrodieG   schedule 29.01.2014plyrvadata.tablehaqida 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.tableda aniqroq ifodalangan muammolar to'plami 0 o'lchoviga ega, ammo bu sizning e'tiqodingizga zid emas;) - person hadley   schedule 29.01.2014data.tableqo'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.2014dplyrvaplyrhaqida 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.SDva boshqalar - bu adolatli -.SDtushunish 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.2014dplyrvadata.tableni solishtirishga misoldir. - person danas.zuokas   schedule 31.01.2014$stmt->store_result(); $stmt-dan keyin -> execute(); va $stmt->bind_result(....) oldidan; va barcha shartlaringiz oxirida $stmt -> close() ni qo'yishingizga ishonch hosil qiling. lekin baribir barcha foydalanuvchilar klklfjnbjfhg kabi har bir parol bilan kirishlari mumkin, lekin asl parol 123456
- person BrodieG   schedule 05.11.2014data.tableo'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. Mendplyrni funktsiyalar to'plami sifatida ko'raman, lekindata.tablean'anaviy ma'lumotlar ramkasidan ancha yaxshi ishlashi va ixcham sintaksisiga ega yangi sinf ob'ekti sifatida. - person David Leal   schedule 15.03.2017